UNIX网络编程:基本TCP套接字编程
如果指定端口号为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三次握手过程的客户。 如下图所示: 查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/ (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |