服务器API涵数
服务器是一个等待任意数量的客户连接的进程,其目的是为客户请求提供相应的服务.服务器必须用通用的命名对连接进行监听.在TCP/IP中,命名就是本地接口的IP地址和端口号.每一个协议都有着不同的寻址方式,因此其命名方法也不同.在Winsock编程中,第一步就是要调用socket或WSASocket并将Socket绑定到通用命名的协议.绑定是通过API方法bind完成的.接下来,将socket通过API函数listen设置为监听模式.最后当客户试图连接时,使用API函数accept或WSAAccept接受接连.
绑定
一旦特定的协议被创建,你必须把它绑定到公开的地址,API函数associates将socket与公开的地址关联,其函数声明如下:
int bind(
SOCKET s,
const struct sockaddr FAR* name,
int namelen
);
参数说明:
s:表示等待客户连接的socket.
name:是一个sockaddr结构, 你必须用使用的协议进行填充,并转换为sockaddr结构.Winsock的头文件将sockaddr结构定义为SOCKADDR类型.
namelen:是指定了协议的地址结构的长度.
下面的示例说明了如何在TCP中使用bind:
SOCKET s;
SOCKADDR_IN tcpaddr;
int port = 5150;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
tcpaddr.sin_family = AF_INET;
tcpaddr.sin_port = htons(port);
tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr));
上例中,一个流socket被创建,接下来设置了用来接受客户连接的TCP/IP地址结构.在这个例子中,socket被绑定到了一个默认的特殊地址 -- INADDR_ANY,并占用了端口号5150.我们可以明确地指定一个IP地址,但INADDR_ANY充许我们绑定到系统中所有可用的接口,这样客户通过任意接口(当然端口号要正确)进行连接都会被我们的监听socket接受.调用bind通常使用本地IP和端口与socket建立关联.
一旦出错, bind将返回SOCKET_ERROR. bind通常产生的错误是WSAEADDRINUSE.在TCP/IP中, WSAEADDRINUSE表示另外的进程已经绑定了本地IP与端口或者指定的IP与端口处于TIME_WAIT状态.如果你对已经绑定的socket调用bind就会返回WSAEFAULT.