2013-06-12 180 views
0

回来了(对不起)C++套接字不能正常工作

我创建了一个插座C++应用程序,但它不能正常工作。

这是我的第一个代码:

void Network::Start() 
{ 
    this->socket = Env::GetSocket(); 

    SOCKADDR_IN sInformation; 

    sInformation.sin_family = AF_INET; 
    sInformation.sin_addr.s_addr = INADDR_ANY; 
    sInformation.sin_port = htons(30000); 

    bind(this->socket, (SOCKADDR*) (&sInformation), sizeof(sInformation)); 
    listen(this->socket, 10); 

    while (true) 
    { 
     this->DO(); 
    } 
} 

和DO功能:

void Network::DO() 
{ 
    SOCKET s = SOCKET_ERROR; 

    sockaddr_in sock_addr; 

    accept(s, (sockaddr*) &sock_addr, NULL); 

    if (INVALID_SOCKET == s) 
    { 
     return; 
    } 
    else 
    { 
     cout << "Received connection from " << inet_ntoa(sock_addr.sin_addr); 
    } 
} 

会发生什么事,总是(即使我连接)S的值INVALID_SOCKET。我通过.SWF连接,但不接受我的连接。我究竟做错了什么?

+2

你需要做的'S =接受(这个 - >插座...' – ctn

+0

@ctn你应该张贴,作为一个答案 – Barmar

+0

接受并返回一个整数,而不是一个套接字对象 –

回答

1

您没有做足够的错误处理,并且您没有正确使用accept()。试试这个:

void Network::Start() 
{ 
    this->socket = Env::GetSocket(); 
    if (this->socket == INVALID_SOCKET) 
    { 
     // error 
     return; 
    } 

    SOCKADDR_IN sInformation = {0}; 

    sInformation.sin_family = AF_INET; 
    sInformation.sin_addr.s_addr = INADDR_ANY; 
    sInformation.sin_port = htons(30000); 

    if (bind(this->socket, (SOCKADDR*) &sInformation, sizeof(sInformation)) != 0) 
    { 
     // error 
     return; 
    } 

    if (listen(this->socket, 10) != 0) 
    { 
     // error 
     return; 
    } 

    while (true) 
    { 
     this->DO(); 
    } 
} 

void Network::DO() 
{ 
    SOCKADDR_IN sock_addr = {0}; 
    socklen_t sock_addr_len = sizeof(sock_addr); 

    SOCKET s = accept(this->socket, (SOCKADDR*) &sock_addr, &sock_addr_len); 
    if (INVALID_SOCKET == s) 
    { 
     return; 
    } 

    cout << "Received connection from " << inet_ntoa(sock_addr.sin_addr); 

    // use s as needed. Don't forget to call close(s) or closesocket(s) 
    // when finished, depending on your platform... 
} 
+0

现在说这个 - >插座== INVALID_SOCKET, DWORD信封:: GetSocket(){ \t回插座(AF_INET,SOCK_STREAM,IPPROTO_TCP); } 它有什么问题? –

+0

'socket()'返回一个'SOCKET',而不是'DWORD'。如果你遇到编译器错误,你可能需要进行类型转换:'return(DWORD)socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);'''this-> socket =(SOCKET)Env :: GetSocket();'如果你是仍然有问题,那么请提供**实际的错误信息**。 –

+0

现在有效,谢谢雷米。 –

1

accept以监听套接字为参数,并且返回新连接的套接字;

socklen_t length = sizeof(sockaddr_in); 
s = accept(this->socket, (sockaddr*) &sock_addr, &length); 

编辑:只是测试的程序,用AF_INET创建,SOCK_STREAM和sInformation清除出插座;

bzero((char *) &sInformation, sizeof(sInformation)); 

......它似乎在MacOS X和Linux上运行良好。

+0

仍然没有效果 –

+0

@x_metal_pride_diamond_x症状是否改变 –

+0

没有,真的还是一样 –