2010-03-21 3 views
0

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

// 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. Когда я отлаживаю программу и проверяю get_socket, это, похоже, просто искалеченное дерьмо. Я поставил точку останова на строке «std :: map». Когда я вхожу в каждую строку вышеуказанного кода, курсор отладки перескакивает прямо из строки «unsigned short port» в первую строку «local_address.sin», хотя я использую шаг в (F11), он не останавливается на struct, int, char или SOCKET, он прыгает прямо над ними.

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

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

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

Это прыгает через эти линии, потому что они не переводят никаких команд. –

ответ

0

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

Согласно MSDN,

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

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

И насколько порт идет ...

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

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

+0

Хорошо, что имеет смысл про htons. Я попробовал ваше предложение сменить SOCK_DGRAM на SOCK_STREAM, но он все равно не будет связываться.Вот мой код привязки: если (Bind (receive_socket (SOCKADDR *) & local_address, SizeOf (local_address)) == SOCKET_ERROR) \t { \t \t closesocket (receive_socket); \t \t возвращение 1; \t} – Ash85

+0

Кроме того, я должен использовать UDP, поэтому это SOCK_DGRAM. – Ash85

+0

Ах. Забудьте эту часть :) Я вижу, вы все равно поняли. –

0
local_address.sin_port = htons(port); 

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

1

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

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

Я узнал об этом, получив номер ошибки от WSAGetLastError() и просмотреть его на сайте MSDN.

Смежные вопросы