Visual C++网络编程(黑客)学习笔记四
服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听队列来接受客户端发送的请求。listen()函数使服务器短的Socket进入监听状态,并设定可以建立的最大连接数(一次同时连接不能超过5个IP)。
listen()函数原型:
int listen(
SOCKET s,
int backlog
);
函数参数解释:
s:指定监听的Socket描述符。
backlog:一次同时连接的最大数目。
该函数调用成功返回0,否则返回SOCKET_ERROR.服务器端的Socket调用完listen()后使其套接字s处于监听状态。处于监听状态的流套接字s将维护一个客户连接请求队列,最多容纳backlog个客户连接请求。
当客户端发出连接请求时,服务器端hwnd视窗会收到Winsock Stack送来自定义的一个消息,为了使服务器端接受客户端的连接请求,就要使用accpet()函数。处于监听状态的流套接字s从客户端连接请求队列中取出排在最前面的一个客户请求,并且创建一个新的套接字来与客户端套接字共同创建连接通道。原先处于监听状态的套接字继续处于监听状态,等待客户端的连接,这样服务器端和客户端才算正式完成通信程序的连接动作。如果创建连接通道成功就返回新创建套接字的描述符,以后与客户端套接字交换数据的是新创建的套接字;如果失败则返回INVALID_SOCKET.
accpet函数原型:
SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);
函数参数解释:
s:处于监听状态的流套接字。
adder:用来返回新创建的套接字的地址结构。
addrlen:指明用来返回新创建的套接字的地址结构的长度。
下面是accept()函数的示例。
//......
struct sockaddr_in addr;
int addrlen;
addrlen = sizeof(addr);
addr = accept(sSocket, (struct sockaddr *)&addr, &addrlen);
//......
