2017-01-16 120 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级帮助:)! –

相关问题