加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (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段并阻塞等待

如果指定端口号为0,那么内核就在bind被调用时选择一个临时端口。然而如果指定IP地址为通配地址,那么内核将等到套接字已连接(TCP)或已在套接字上发出数据报(UDP)时才选择一个本地IP地址。

对于IPv4来说,统配地址由常值INADDR_ANY来指定,其值一般为0.

struct sockaddr_in servaddr;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

其实无论是网络字节序还是主机字节序,INADDR_ANY的值(为0)都是一样的,因此使用htonl并非必需。

为了得到内核选择的临时端口值,必须调用函数getsockname来返回协议地址。

从bind函数返回的一个常见错误时EADDRINUSE(“Address already in use",地址已使用),后面的博客会讨论SO_REUSEADDR和SO_REUSEPORT这两个套接字选项。

注意:端口号必须不小于1024,除非该进程具有相应的特权(即为超级用户)。

3、listen函数

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

功能:将套接字用于监听进入的连接

原型:

int listen(int sockfd, int backlog);

参数

sockfd:socket函数返回的套接字

backlog:规定内核为此套接字排队的最大连接个数

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

一般来说,listen函数应该在调用socket和bind函数之后,调用函数accept之前调用。

listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应接受指向该套接字的连接请求,调用listen导致套接字从CLOSE状态转换到LISTEN状态。

为了理解其中的backlog参数,对于给定的监听套接字,内核要维护两个队列:

未完成连接队列:已由客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程

已完成连接的队列:每个已完成TCP三次握手过程的客户。

如下图所示:

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

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

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/

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

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

推荐文章
    热点阅读