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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM