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