Проблема создания сокета с C ++ в winsock2 - PullRequest
0 голосов
/ 21 марта 2010

У меня самая странная проблема, вызывающая у меня головную боль. Рассмотрим следующий код:

// Create and bind socket
 std::map<Connection, bool> clients;
 unsigned short port=6222;
 struct sockaddr_in local_address, from_address;
 int result;
 char buffer[10000];
 SOCKET receive_socket;
 local_address.sin_family = AF_INET;
 local_address.sin_addr.s_addr = INADDR_ANY;
 local_address.sin_port = htons(port);
 receive_socket = socket(AF_INET,SOCK_DGRAM,0);

То, что происходит, - receive_socket не является обязательным, я получаю SOCKET_ERROR. Когда я отлаживаю программу и проверяю receive_socket, она кажется просто искаженным дерьмом. Я поставил точку останова на строке 'std :: map'. Когда я вхожу в каждую строку вышеуказанного кода, курсор отладки переходит прямо из строки «unsigned short port» в первую строку «local_address.sin», хотя я использую шаг в (F11), он не останавливается строки struct, int, char или SOCKET, они прыгают прямо над ними.

В этот момент я наводю указатель мыши на local_address, from_address, результат, буфер и receive_socket. Они все полны искаженного дерьма. Это потому, что я еще не определил эти переменные? Я также заметил, что когда я достигаю нижней части приведенного выше кода, local_address.sin_port устанавливается в 19992, но это должно быть 6222?

Редактировать: вот мой код привязки, который не выполняется, потому что утверждение if верно:

if(bind( receive_socket, (SOCKADDR*) &local_address, sizeof(local_address)) == SOCKET_ERROR) 
    {
        closesocket(receive_socket);
        return 1;
    }

Ответы [ 3 ]

1 голос
/ 21 марта 2010

Я разобрался с ответом!Проблема была в том, что я не вызывал WSAStartup нигде в моей программе.Следующий код в начале исправил это:

WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
    {
        return 1; 
    }

Я выяснил это, получив номер ошибки из WSAGetLastError () и просмотрев его в msdn.

0 голосов
/ 21 марта 2010
local_address.sin_port = htons(port);

Я нашел это довольно странным. Кроме того, почему htons () порт? Это бессмысленно. Не могли бы вы просто использовать getaddrinfo () или что-то в этом роде, или winsock требует вручную вводить информацию?

0 голосов
/ 21 марта 2010

Попробуйте изменить SOCK_DGRAM на SOCK_STREAM

Согласно MSDN,

SOCK_STREAM - тип сокета, который обеспечивает последовательный, надежный, двусторонний, основанный на соединении байтпотоки с механизмом передачи данных OOB.Этот тип сокета использует протокол управления передачей (TCP) для семейства интернет-адресов (AF_INET или AF_INET6).

SOCK_DGRAM - тип сокета, который поддерживает дейтаграммы, которые являются ненадежными буферами без установления соединения фиксированного (обычно небольшого размера)максимальная длина.В этом типе сокета используется протокол пользовательских дейтаграмм (UDP) для семейства интернет-адресов (AF_INET или AF_INET6).

А что касается порта ...

local_address.sin_port установлен на 19992, но он должен быть 6222?

htons преобразует номер порта в порядке байтов хоста в порядок сетевых байтов (см. здесь )

...