2017-01-16 14 views
1

私はWINSOCKで基本的なネットワークプログラミングを学んでいます。サーバーは、SOCKET_ERRORを返す過去のbind()を取得しないという点を除いて、正常にビルドして実行します。WinSockが明白な理由でSOCKET_ERRORを返す

出力: "エラー:SOCKET_ERROR(-1)"

コード:

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

inet_pton

#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

が提供されたIN_ADDR、ないSOCKADDR_INを期待。 SOCKADDR_ININ_ADDRので、OPはsin_addrメンバーへのポインタを提供するために、少し違った呼び出しを行う必要が含まれています

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

をそれから、彼らはListenForConnectionの最後に行方不明return true;のようないくつかの他の問題を整理する必要があります、置き忘れブラケット

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

なく

listen(NewConnection, SOMAXCONN); 
の戻りコードをチェックします210

そして、彼らは行かなくてはなりません。

+0

ありがとう、等級の助け:)! –

関連する問題