2010-05-23 5 views
-1

J'essaye d'écrire un programme simple qui recevra une chaîne de 20 caractères maximum et qui imprimera cette chaîne à l'écran.bind() échoue avec une erreur de socket Windows 10038

Le code compile, mais je reçois un bind() a échoué: 10038. Après avoir regardé le numéro d'erreur sur msdn (fonctionnement de prise sur nonsocket), j'ai changé un code de

int sock; 

à

SOCKET sock 

qui ne devrait pas faire la différence, mais on ne sait jamais.

Voici le code:

#include <iostream> 
#include <winsock2.h> 
#include <cstdlib> 
using namespace std; 

const int MAXPENDING = 5; 
const int MAX_LENGTH = 20; 

void DieWithError(char *errorMessage); 

int main(int argc, char **argv) 
{ 
    if(argc!=2){ 
    cerr << "Usage: " << argv[0] << " <Port>" << endl; 
    exit(1); 
    } 

    // start winsock2 library 
    WSAData wsaData; 
    if(WSAStartup(MAKEWORD(2,0), &wsaData)!=0){ 
    cerr << "WSAStartup() failed" << endl; 
    exit(1); 
    } 

    // create socket for incoming connections 
    SOCKET servSock; 
    if(servSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)==INVALID_SOCKET) 
    DieWithError("socket() failed"); 

    // construct local address structure 
    struct sockaddr_in servAddr; 
    memset(&servAddr, 0, sizeof(servAddr)); 
    servAddr.sin_family = AF_INET; 
    servAddr.sin_addr.s_addr = INADDR_ANY; 
    servAddr.sin_port = htons(atoi(argv[1])); 

    // bind to the local address 
    int servAddrLen = sizeof(servAddr); 
    if(bind(servSock, (SOCKADDR*)&servAddr, servAddrLen)==SOCKET_ERROR) 
    DieWithError("bind() failed"); 

    // mark the socket to listen for incoming connections 
    if(listen(servSock, MAXPENDING)<0) 
    DieWithError("listen() failed"); 

    // accept incoming connections 
    int clientSock; 
    struct sockaddr_in clientAddr; 
    char buffer[MAX_LENGTH]; 
    int recvMsgSize; 

    int clientAddrLen = sizeof(clientAddr); 
    for(;;){ 
    // wait for a client to connect 
    if((clientSock=accept(servSock, (sockaddr*)&clientAddr, &clientAddrLen))<0) 
     DieWithError("accept() failed"); 
    // clientSock is connected to a client 


    // BEGIN Handle client 
    cout << "Handling client " << inet_ntoa(clientAddr.sin_addr) << endl; 
    if((recvMsgSize = recv(clientSock, buffer, MAX_LENGTH, 0)) <0) 
     DieWithError("recv() failed"); 

    cout << "Word in the tubes: " << buffer << endl; 
    closesocket(clientSock); 

    // END Handle client 
    } 
} 

void DieWithError(char *errorMessage) 
{ 
    fprintf(stderr, "%s: %d\n", errorMessage, WSAGetLastError()); 
    exit(1); 
} 

Répondre

2

Le problème est avec

servSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)==INVALID_SOCKET 

qui n'associe pas comme vous pensez. Pourquoi voudriez-vous même écrire quelque chose comme ça, quel est le problème avec

SOCKET servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
if(servSock == INVALID_SOCKET) 
    DieWithError("socket() failed"); 

?

+0

Merci pour votre aide! Je copiais (mais à la main) d'un tutoriel. Vous avez raison, cependant, la ligne semblait moche. – lowerkey