connect函数和WSAConnect函数
最后一步就是连接.这是通过调用connect 函数或WSAConnect函数来完成的.我们先来看看该函数的Winsock1版本,其定义如下:
int connect(
SOCKET s,
const struct sockaddr FAR* name,
int namelen
);
该函数的参数是相当清楚的:s是即将在其上面建立连接的那个有效TCP套接字;name是针对TCP(说明连接的服务器)的套接字地址结构(SOCKADDR_IN);namelen则是名字参数的长度.
Winsock2版本中,它的定义是这样的:
int WSAConnect(
SOCKET s,
const struct sockaddr FAR* name,
int namelen,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
LPQOS lpGQOS
);
前三个参数和connect API函数的参数是完全一样的.另外两个参数----lpCallerData和lpCalleeData,是字串缓冲区,用于收发请求连接时的数据.lpCallerData参数是指向缓冲区的指针,缓冲区内包括客户机向服务器发出的请求连接的数据.lpCalleeData参数则指向另一个缓冲区,区内包括服务器向客户机返回的建立连接时的数据.这两个参数都是WSABUF结构,因此,诺是lpCallerData,len字段应该设为buf字段中准备传输的数据长度.诺是lpCalleeData,len字段则代表buf中的缓冲区长度,设为从服务器返回的数据长度.最后两个参数-------lpSQOS和lpGQOS,表示QOS结构,该结构对即将建立的连接上收发数据所需要的带宽进行了定义.lpQOS参数用于指定套接字s需要的服务质量,而lpGQOs则用于指定套接字组所需要的服务质量.目前,尚未提供对套接字组的支持.诺lpQOS是空值,则表明没有某应用专用的QOS.
如果你想连接的计算机没有监听指定端口这一进程,connect调用就会失败,并发生错误WSAECONNREFUSED.另一个错误可能是WSAETIMEDOUT, 这种情况一般发生在试图连接的计算机不能用时(亦可能因为到主机之间的路由上出现硬件故障或主机目前不在网上).