почему bind () возвращает SOCKET_ERROR - PullRequest
1 голос
/ 19 января 2009

Без:

  • MFC
  • АТЛ

Используя чистый C ++, WSAGetLastError () возвращает 10014 - неверный адрес

  • Что я упускаю / делаю неправильно?

Иллюстрация кода:

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);
}

1 Ответ

5 голосов
/ 19 января 2009

Если это ваш реальный код, у вас есть неправильные скобки в вызове bind. Один из двух в конце должен быть перемещен сразу после «sizeof (sin)».

Другими словами, измените его с:

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

до:

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

Это небольшая ошибка C, не связанная с программированием сокетов, но иллюстрирующая, как нужно быть осторожным при использовании языка, который позволяет легко иметь синтаксически правильные операторы, которые семантически неверны.

Как у вас есть, он вычисляет «sizeof(sin) == SOCKET_ERROR» (что всегда ложно (ноль), поскольку sizeof (что-то) всегда равно одному или нескольким, а SOCKET_ERROR всегда равно -1, по крайней мере для WinSock).

Затем он передает этот ноль в качестве третьего аргумента в bind (), который, естественно, жалуется, что вы не указали достаточно большой размер для структуры адреса.

И из-за этого bind () возвращает ненулевой код ошибки, поэтому ваш блок if выполняется.

Очень тонкий. Мое уважение к языку C остается высоким, хотя я использую его 20 с лишним лет - уважение в смысле «я уважаю львов, когда я в Серенгети», а не «я уважаю мнение моей жены»: -)

...