2017-01-16 37 views
1

我正在用WINSOCK學習基本的網絡編程。服務器構建並執行得很好,除非它不能通過返回SOCKET_ERROR的bind()。WinSock返回SOCKET_ERROR沒有明顯的原因

輸出: 「錯誤:SOCKET_ERROR(-1)」

代碼:

#pragma once 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 
#pragma comment (lib,"ws2_32.lib") 
#include <WinSock2.h> 
#include <WS2tcpip.h> 
#include <string> 
#include <iostream> 

SOCKET NewConnection; 

bool ListenForConnection(int PORT, std::string IP) 
{ 
    WSADATA wsadata; 
    int wsa_error = WSAStartup(0x0202, &wsadata); 
    if (wsa_error) 
    { 
     std::cerr << WSAGetLastError() << std::endl; 
     return false; 
    } 
    if (wsadata.wVersion != 0x0202) 
    { 
     std::cerr << WSAGetLastError() << std::endl; 
     WSACleanup(); 
     return false; 
    } 

    SOCKADDR_IN IncomingClient; 
    IncomingClient.sin_family = AF_INET; 
    IncomingClient.sin_port = htons(PORT); 
    inet_pton(AF_INET, IP.c_str(), &(IncomingClient)); 

    NewConnection = socket(AF_INET, SOCK_STREAM, NULL); 
    if (NewConnection == INVALID_SOCKET) 
    { 
     std::cerr << "Error: " << NewConnection << std::endl; 
     return false; 
    } 
    if (bind(NewConnection, (LPSOCKADDR)&IncomingClient, sizeof(IncomingClient) == SOCKET_ERROR)) 
    { 
     std::cerr << "Error: SOCKET_ERROR (-1)" << std::endl; 
     return false; 
    } 
    listen(NewConnection, SOMAXCONN); 

} 



int main() 
{ 
    int PORT = 1337; 
    std::string IP = "0.0.0.0"; 
    ListenForConnection(PORT, IP); 
    system("pause"); 
    return 0; 
} 
+0

嘗試使用,而不是0.0.0.0 INADDR_ANY,檢查端口尚未使用,否則更改值,然後再試一次 – Raindrop7

+0

已經試過了,沒有效果。 –

+0

不同的端口也不工作,我現在嘗試了幾個。 –

回答

2

inet_pton(AF_INET, IP.c_str(), &(IncomingClient)); 

inet_pton期望一個IN_ADDR,而不是已經提供SOCKADDR_INSOCKADDR_IN包含IN_ADDR,所以OP需要撥打電話有點不同,提供的指針sin_addr成員:

inet_pton(AF_INET, IP.c_str(), &(IncomingClient.sin_addr)); 

然後,他們需要理清一些其他問題,如缺少return true;ListenForConnection年底,放錯位置的托架

                  This bracket here V 
if (bind(NewConnection, (LPSOCKADDR)&IncomingClient, sizeof(IncomingClient) == SOCKET_ERROR)) 
                  should be here^

和未檢查的

listen(NewConnection, SOMAXCONN); 
返回代碼210

他們應該很好去。

+0

謝謝,A級幫助:)! –

相關問題