инициализировать winsock без wsadata с помощью WSAStartup?

#c #winsock

#c #winsock

Вопрос:

В принципе, я хотел бы знать, можете ли вы инициализировать winsock без создания переменной WSADATA или передачи значения WSADATA непосредственно в функцию WSAStartup?

Я пытался :

 WSAStartup(0x202, NULL);
WSAStartup(0x202, (WSADATA *)0x00);
 

с вышесказанным сокет не recv() работает, но затем он снова начинает работать, если у вас есть:

 WSADATA wsaData;
WSAStartup(0x202, amp;wsaData);
 

На основании документации в нем говорится: «Это позволяет приложению или DLL указывать требуемую версию сокетов Windows и извлекать сведения о конкретной реализации сокетов Windows». Итак, не могли бы мы напрямую определить ячейку памяти для хранения возвращаемого значения?

Комментарии:

1. В документации говорится, что вы должны указать указатель на WSADATA структуру. Так что нет, WSAStartup(0x202, (WSADATA *)0x00); не сработает. Вы также не проверили значение, возвращаемое WSAStartup .

2. Почему вы хотите это сделать? Функция документирована как получающая указатель на WSADATA структуру. Даже если сбой не произошел в версии Windows, в которой вы разрабатываете, в следующий раз, когда эта версия будет обновлена, или кто-то запустил приложение в другой системе, или фаза луны изменилась, вполне может произойти сбой. Намеренный вызов неопределенного поведения — плохая идея.

Ответ №1:

В принципе, я хотел бы знать, можете ли вы инициализировать winsock без создания переменной WSADATA или передачи значения WSADATA непосредственно в функцию WSAStartup?

Требуется вызов WSAStartup() , в противном случае большинство функций Winsock завершатся WSANOTINITIALISED ошибкой. И WSAStartup() сам по себе требует указателя на выделенную память для заполнения WSADATA данными. Это необязательно.

Итак, не могли бы мы напрямую определить ячейку памяти для хранения возвращаемого значения?

Это именно то, что делает объявление переменной. Но в более общем плане, да, вы, безусловно, можете передать любой ненулевой адрес памяти, если он является допустимым адресом памяти в вызывающем процессе и был выделен для хранения не менее sizeof(WSADATA) количества байтов.