connect()函数

功能

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,可以参考我的另一篇博客:

https://www.cnblogs.com/cyx-b/p/12450811.html

原文地址:https://www.cnblogs.com/cyx-b/p/12512525.html