功能
CONNECT函数建立到指定套接字的连接。
函数原型
int WSAAPI connect( SOCKET s, const sockaddr *name, int namelen );
参数
s
标识未连接套接字的描述符
name
指向应建立连接的sockaddr结构的指针。
namelen
name参数指向的sockaddr结构的长度(以字节为单位)。
返回值
如果没有发生错误,则CONNECT返回零。否则,它将返回Socket_Error,并且可以通过调用WSAGetLastError检索特定的错误代码。
在阻塞套接字上,返回值表示连接尝试的成功或失败。
使用非阻塞套接字,连接尝试无法立即完成。在这种情况下,connect将返回Socket_Error,而WSAGetLastError将返回WSAEWOULDBLOCK。在这种情况下,有三种可能的方案:
- 通过检查套接字是否可写,使用SELECT函数确定连接请求是否完成。
- 如果应用程序使用WSAAsyncSelect表示对连接事件感兴趣,则应用程序将收到FD_CONNECT通知,指示连接操作是否完成。
- 如果应用程序使用WSAEventSelect来表示对连接事件的兴趣,则将向关联的事件对象发出信号,指示连接操作已经完成(成功与否)。
使用
#define MAX_LINE 10000 #define PORT 7210 SOCKET ClientSocket; struct sockaddr_in ServerAddr; char SendBuffer[MAX_LINE]; ServerAddr.sin_family = AF_INET; ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); ServerAddr.sin_port = htons(PORT); memset(ServerAddr.sin_zero, 0x00, 8); //一个细节:connect的第二个参数ServerAddr设置为sockaddr_in类型的变量, //然后再connect中应当将其强转为sockaddr类型 iResult = connect(ClientSocket, (struct sockaddr*) & ServerAddr, sizeof(ServerAddr)); if (iResult == SOCKET_ERROR) { cout << "Connect Error::" << GetLastError() << endl; return -1; } else { cout << "连接成功!" << endl; }
特别需要注意的是,对于第二个参数,我们建立变量的时候,往往是使用的struct sockaddr_in类型,因为这样方便我们对协议类型、IP地址、端口号进行赋值,但是在connect中第二个参数应该是sockaddr类型,可以通过强制类型转换使struct sockaddr_in类型的变量转化为struct sockaddr类型。
对于sockaddr_in和sockaddr,可以参考我的另一篇博客: