没有合适的资源?快使用搜索试试~ 我知道了~
首页Unix系统下异步I/O与TCP套接字详解
Unix系统下异步I/O与TCP套接字详解
需积分: 9 0 下载量 188 浏览量
更新于2024-07-17
收藏 214KB PDF 举报
"《通过套接字使用TCP在Unix系统中的实践》是一份详尽的文档,主要针对Unix系统中的套接字编程,特别是异步I/O的应用。本文档首先从基础的Unix文件I/O操作入手,介绍了如何在操作系统级别进行文件读写操作。接着,它深入探讨了如何利用套接字(socket)技术在TCP/IP网络环境中进行通信,重点讲解了TCP协议的工作原理和在网络编程中的应用。 第三部分是文章的核心内容,它强调了非阻塞I/O(Non-blocking I/O)在提高性能方面的优势。作者通过一个实际的例子——异步版本的finger客户端,展示了如何利用非阻塞I/O避免长时间阻塞,从而实现更高效的并发处理。在现代多线程或多进程编程中,这种特性对于实时性和响应性至关重要。 文档假设读者已经熟悉C和C++这两种编程语言,特别是掌握了模板类的使用,因为异步编程常常涉及到这些高级特性。同时,能够熟练地在Unix系统上开发程序也是必要的。然而,对网络标准或底层Unix I/O的具体细节了解并非必需,作者会尽可能地引导读者理解核心概念。 文档中的类型设置规范也值得注意:斜体字(如open)表示Unix系统调用,而等宽字体(如nbytes)则用于标识C代码片段或C对象名,以帮助读者区分和理解不同类型的文本。 《通过套接字使用TCP在Unix系统中的实践》是一本实用的指南,适合那些希望扩展其网络编程技能,尤其是对异步I/O感兴趣的程序员阅读。无论是初学者还是有经验的开发者,都可以从中获取到提升性能和编写高效网络应用程序的关键知识。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/11228305/bg7.jpg)
#define FINGER_PORT 79
#define bzero(ptr, size) memset (ptr, 0, size)
/* Create a TCP connection to host and port. Returns a file
* descriptor on success, -1 on error. */
int
tcpconnect (char *host, int port)
{
struct hostent *h;
struct sockaddr_in sa;
int s;
/* Get the address of the host at which to finger from the
* hostname. */
h = gethostbyname (host);
if (!h || h->h_length != sizeof (struct in_addr)) {
fprintf (stderr, "%s: no such host\n", host);
return -1;
}
/* Create a TCP socket. */
s = socket (AF_INET, SOCK_STREAM, 0);
/* Use bind to set an address and port number for our end of the
* finger TCP connection. */
bzero (&sa, sizeof (sa));
sa.sin_family = AF_INET;
sa.sin_port = htons (0); /* tells OS to choose a port */
sa.sin_addr.s_addr = htonl (INADDR_ANY); /* tells OS to choose IP addr */
if (bind (s, (struct sockaddr *) &sa, sizeof (sa)) < 0) {
perror ("bind");
close (s);
return -1;
}
/* Now use h to set set the destination address. */
sa.sin_port = htons (port);
sa.sin_addr = *(struct in_addr *) h->h_addr;
/* And connect to the server */
if (connect (s, (struct sockaddr *) &sa, sizeof (sa)) < 0) {
perror (host);
close (s);
return -1;
}
return s;
}
int
main (int argc, char **argv)
7
![](https://csdnimg.cn/release/download_crawler_static/11228305/bg8.jpg)
{
char *user;
char *host;
int s;
int nread;
char buf[1024];
/* Get the name of the host at which to finger from the end of the
* command line argument. */
if (argc == 2) {
user = malloc (1 + strlen (argv[1]));
if (!user) {
fprintf (stderr, "out of memory\n");
exit (1);
}
strcpy (user, argv[1]);
host = strrchr (user, ’@’);
}
else
user = host = NULL;
if (!host) {
fprintf (stderr, "usage: %s user@host\n", argv[0]);
exit (1);
}
*host++ = ’\0’;
/* Try connecting to the host. */
s = tcpconnect (host, FINGER_PORT);
if (s < 0)
exit (1);
/* Send the username to finger */
if (write (s, user, strlen (user)) < 0
|| write (s, "\r\n", 2) < 0) {
perror (host);
exit (1);
}
/* Now copy the result of the finger command to stdout. */
while ((nread = read (s, buf, sizeof (buf))) > 0)
write (1, buf, nread);
exit (0);
}
3.4 TCP server programming
Now let’s loo k a t what happens in a TCP server. A TCP server, like a client, begins by
calling socket to create a socket and by binding the socket to a well-known port using bind
(although optional for clients, servers nearly always call bind to specify the por t on which
8
剩余37页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/958ba08773e04aee8dd376095e8631a7_sunny_xiaot.jpg!1)
未停丶
- 粉丝: 203
- 资源: 4
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Lombok 快速入门与注解详解
- SpringSecurity实战:声明式安全控制框架解析
- XML基础教程:从数据传输到存储解析
- Matlab实现图像空间平移与镜像变换示例
- Python流程控制与运算符详解
- Python基础:类型转换与循环语句
- 辰科CD-6024-4控制器说明书:LED亮度调节与触发功能解析
- AE particular插件全面解析:英汉对照与关键参数
- Shell脚本实践:创建tar包、字符串累加与简易运算器
- TMS320F28335:浮点处理器与ADC详解
- 互联网基础与结构解析:从ARPANET到多层次ISP
- Redhat系统中构建与Windows共享的Samba服务器实战
- microPython编程指南:从入门到实践
- 数据结构实验:顺序构建并遍历链表
- NVIDIA TX2系统安装与恢复指南
- C语言实现贪吃蛇游戏基础代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)