加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX网络编程:基本TCP套接字编程

发布时间:2016-09-26 16:10:57 所属栏目:Unix 来源:站长网
导读:副标题#e# 一、基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待

当客户端发起connect而导致发送syn分节给服务器端握手,如果这时两个队列都是满的,tcp就忽略此分节,并且不发RST,这将导致客户端TCP重发SYN(超时),服务器端忽略syn而不发RST响应的原因是如果发RST ,客户端connect将立即返回错误,强制客户端进程处理这种情况,而不是让tcp的正常重传机制来处理。实际上所有源自Berkeley的实现都是忽略新的SYN分节。

还有,backlog为0 时在linux上表明允许不受限制的连接数,这是一个缺陷,因为它可能会导致SYN Flooding(拒绝服务型攻击)。

linux 系统tcp /ip协议栈有个选项可以设置未链接队列大小:tcp_max_syn_backlog

huangcheng@ubuntu:~$ cat /proc/sys/net/ipv4/tcp_max_syn_backlog

512

每当有一个客户端connect了,listen的队列中就加入一个连接,每当服务器端accept了,就从listen的队列中取出一个连接,转成一个专门用来传输数据的socket(accept函数的返回值)。

4、accept函数

包含头文件<sys/socket.h>

功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞。

原型:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数

sockfd:服务器套接字

addr:将返回对等方的套接字地址

addrlen:返回对等方的套接字地址长度

返回值:成功返回非负整数,失败返回-1

如果accept成功,那么其返回值是由内核自动生成的一个全新描述符,代表与返回客户的TCP连接。在accept函数的第一个参数为监听套接字描述符,称为它的返回值为已连接套接字描述符。

区分这两个套接字非常重要,一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接字。当服务器完成对某个给定客户的服务时,相应的已连接套接字就被关闭。

如果服务器调用accept并且当前没有连接请求,服务器会阻塞直到一个请求到来。如果sockfd处于非阻塞模式,accept会返回-1并将errno设置为EAGAIN或EWOULDBLOCK。

5、connect函数

包含头文件<sys/socket.h>

功能:建立一个连接至addr所指定的套接字

原型:

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数

sockfd:未连接套接字

addr:要连接的套接字地址

addrlen:第二个参数addr长度

返回值:成功返回0,失败返回-1

如果套接字描述符处于非阻塞模式下,那么在连接不能马上建立时,connect将会返回-1,并且将errno设为特殊的错误码EINPROGRESS。

作者:csdn博客 ctthuangcheng

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读