C语言中等待socket连接和对socket定位的方法
C语言listen()函数:等待连接
头文件:
#include<sys/socket.h>
定义函数:
intlisten(ints,intbacklog);
函数说明:listen()用来等待参数s的socket连线.参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误.Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept().通常listen()会在socket(),bind()之后调用,接着才调用accept().
返回值:成功则返回0,失败返回-1,错误原因存于errno
附加说明:listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型.如果socket为AF_INET则参数backlog最大值可设至128.
错误代码:
EBADF参数sockfd非合法socket处理代码
EACCESS权限不足
EOPNOTSUPP指定的socket并未支援listen模式.
C语言bind()函数:对socket定位
头文件:
#include<sys/types.h>#include<sys/socket.h>
定义函数:intbind(intsockfd,structsockaddr*my_addr,intaddrlen);
函数说明:bind()用来设置给参数sockfd的socket一个名称.此名称由参数my_addr指向一sockaddr结构,对于不同的socketdomain定义了一个通用的数据结构
structsockaddr { unsignedshortintsa_family; charsa_data[14]; };
1、sa_family为调用socket()时的domain参数,即AF_xxxx值.
2、sa_data最多使用14个字符长度.
此sockaddr结构会因使用不同的socketdomain而有不同结构定义,例如使用AF_INETdomain,其socketaddr结构定义便为
structsocketaddr_in { unsignedshortintsin_family; uint16_tsin_port; structin_addrsin_addr; unsignedcharsin_zero[8]; }; structin_addr { uint32_ts_addr; };
1、sin_family即为sa_family
2、sin_port为使用的port编号
3、sin_addr.s_addr为IP地址sin_zero未使用.
参数addrlen为sockaddr的结构长度.
返回值:成功则返回0,失败返回-1,错误原因存于errno中.
错误代码:
1、EBADF参数sockfd非合法socket处理代码.
2、EACCESS权限不足
3、ENOTSOCK参数sockfd为一文件描述词,非socket.