Domanda

Senza:

  • MFC
  • ATL

Utilizzando puro C ++, WSAGetLastError () restituisce 10014 - Indirizzo errato

  • Cosa mi sto perdendo / facendo di sbagliato?

Illustrazione del codice:

sockaddr_in sin;
SOCKET server;

if ((server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)
{
    cerr << "Error: socket() return value == SOCKET_ERROR" << endl;
    WSACleanup();
    exit (EXIT_FAILURE);
}

sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(1234); //random port

if(bind(server, (sockaddr *)&sin, sizeof(sin) == SOCKET_ERROR))
{
    wError = WSAGetLastError();
    cerr << "Error: bin() return value == SOCKET_ERROR\n"
            "Details: " << wError << endl;
    WSACleanup();
    exit (EXIT_FAILURE);
}
È stato utile?

Soluzione

Se questo è il tuo vero codice, hai le parentesi nel posto sbagliato nella chiamata di bind. Uno dei due alla fine dovrebbe essere spostato immediatamente dopo "sizeof (sin)".

In altre parole, cambiarlo da:

if(bind(server, (sockaddr *)&sin, sizeof(sin) == SOCKET_ERROR))

a:

if(bind(server, (sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)

Questo è un sottile errore C non correlato alla programmazione socket, ma illustra come è necessario fare attenzione quando si utilizza un linguaggio che semplifica la presenza di istruzioni sintatticamente corrette semanticamente errate.

Per come lo hai, calcola " sizeof (sin) == SOCKET_ERROR " (che è sempre falso (zero) poiché sizeof (qualcosa) è sempre uno o più e SOCKET_ERROR è sempre -1, almeno per WinSock).

Quindi passa questo zero come terzo argomento per bind () che naturalmente si lamenta che non hai dato una dimensione abbastanza grande per la struttura dell'indirizzo.

E, per questo motivo, bind () sta restituendo un codice di errore diverso da zero, motivo per cui il tuo if-block sta eseguendo.

Molto sottile. Il mio rispetto per il linguaggio C rimane elevato, anche se lo uso da 20 anni dispari - rispetto nel senso di "Rispetto i leoni quando sono nel Serengeti" anziché " Rispetto le opinioni di mia moglie " : -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top