服务器端操作 socket(套接字)
(1)在初始化阶段调用wsastartup()
此函数在应用程序中初始化windows sockets dll ,只有此函数调用成功后,应用程序才可以再调用其他windows sockets dll中的api函数。在程式中调用该函数的形式如下:wsastartup(0x0202,(lpwsadata)&wsadata),其中0x0202表示我们用的是winsocket2.0版本,wsaata用来存储系统传回的关于winsocket的资料。
(2)建立socket
初始化winsock的动态连接库后,需要在服务器端建立一个监听的socket,为此可以调用socket()函数用来建立这个监听的socket,并定义此socket所使用的通信协议。此函数调用成功返回socket对象,失败则返回invalid_socket(调用wsagetlasterror()可得知原因,所有winsocket 的函数都可以使用这个函数来获取失败的原因)。
socket pascal far socket( int af, int type, int protocol )
参数: af:目前只提供 pf_inet(af_inet);
type:socket 的类型 (sock_stream、sock_dgram);
protocol:通讯协定(如果使用者不指定则设为0);
如果要建立的是遵从tcp/ip协议的socket,第二个参数type应为sock_stream,如为udp(数据报)的socket,应为sock_dgram。
(3)绑定端口
接下来要为服务器端定义的这个监听的socket指定一个地址及端口(port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回socket_error。
int pascal far bind( socket s, const struct sockaddr far *name,int namelen );
参 数: s:socket对象名,即通过socket函数创建的socket对象;
name:socket的地址值,这个地址必须是执行这个程式所在机器的ip地址,这个地址为地址结构,其中包含了本机的ip地址和监听端口号;
namelen:name的长度,即地址结构的长度;
如果使用者不在意地址或端口的值,那么可以设定地址为inaddr_any,及port为0,windows sockets 会自动将其设定适当之地址及port (1024 到 5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值。

