listen 函数
功能
将套接字置于侦听传入连接的状态。
语法
int WSAAPI listen(
SOCKET s,
int backlog
);
参数一:标识绑定的未连接套接字的描述符
参数二:挂起连接队列的最大长度
如果设置为 SOMAXCONN,则负责套接字的基础服务提供商会将积压工作设置为最大合理值。
返回值
如果未发生错误,返回零。否则,返回 SOCKET_ERROR,可以通过调用 WSAGetLastError 来检索特定的错误代码。
accept函数
功能
accept 函数允许在套接字上尝试传入连接。listen 函数用于监听客户端传来的链接,accept 函数将客户端的信息绑定到一个 socket 上。
语法
SOCKET WSAAPI accept(
SOCKET s,
sockaddr *addr,
int *addrlen
);
参数一:已使用 listen 函数处于侦听状态的套接字
即服务器端的 socket。
参数二:客户端的地址端口信息结构体
用于监视客户端,通过该结构体记录客户端 IP 地址与端口号。
参数三:参数二的大小
指针类型,指向参数二的长度。
返回值
如果未发生错误, 则返回一个类型为 SOCKET 的值,该值是一个已建立连接的新的套接字的描述符。否则,返回 INVALID_SOCKET 值,可以通过调用 WSAGetLastError 来检索特定的错误代码。
特点
阻塞
若没有客户端链接,则一直等待,无返回值。
一对一
一个 accept 函数只能将服务器端与一个客户端建立连接,若想将服务器端与多个客户端建立连接则需循环调用 accept 函数,且调用次数与客户端个数相同,否则会阻塞。
recv 函数(服务器端)
功能
从连接的套接字或绑定的无连接套接字接收数据,即接收指定客户端发送的消息。
语法
int WSAAPI recv(
SOCKET s,
char *buf,
int len,
int flags
);
参数一:标识连接的套接字的描述符
即客户端 socket,一个客户端对应唯一的 socket。
参数二:指向用于接收传入数据的缓冲区的指针
即客户端消息的存储空间,是一个字符数组(一般设 1500 字节,即网络传输的最大单元)。
参数三:buf 参数指向的缓冲区的长度(以字节为单位)
即参数二指向的缓冲区的长度,或者也可设为想要从缓冲区内读取的字节数(不能超过缓冲区长度)。
参数四:数据的读取方式
一般写 0。
返回值
如果未发生错误,则返回收到的字节数,buf 参数指向的缓冲区将包含接收的此数据。 如果连接已正常关闭(客户端下线),则返回值为零。否则,将返回SOCKET_ERROR值,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。