Опция сокета TCP_NODELAY для Windows требует 8-битного Bool?
Вот мой пример кода (извините, он довольно длинный):
#include "stdafx.h"
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
typedef BOOL OPT_TYPE;
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
int handle= socket(AF_INET, SOCK_STREAM, 0);
if(SOCKET_ERROR == handle )
{
int error = WSAGetLastError();
printf("ERROR in socket: errno: %d\n", error);
return error;
}
OPT_TYPE flag = -1;
int flagLength = sizeof(flag);
if (SOCKET_ERROR == getsockopt(handle, IPPROTO_TCP, TCP_NODELAY,
reinterpret_cast<char*>(&flag), &flagLength))
{
int error = WSAGetLastError();
printf("ERROR in getsockopt: errno: %d\n", error);
return error;
}
if(TRUE != flag && FALSE != flag)
{
printf("ERROR in getsockopt (default value): flag is invalid: %d, length is %d\n", flag, flagLength);
}
OPT_TYPE setflag = TRUE;
if (SOCKET_ERROR == setsockopt(handle, IPPROTO_TCP, TCP_NODELAY,
reinterpret_cast<char*>(&setflag), flagLength))
{
int error = WSAGetLastError();
printf("ERROR in getsockopt: errno: %d\n", error);
return error;
}
if (SOCKET_ERROR == getsockopt(handle, IPPROTO_TCP, TCP_NODELAY,
reinterpret_cast<char*>(&flag), &flagLength))
{
int error = WSAGetLastError();
printf("ERROR in getsockopt: errno: %d\n", error);
return error;
}
if(TRUE != flag && FALSE != flag)
{
printf("ERROR in getsockopt (default value): flag is invalid: %d, length is %d\n", flag, flagLength);
}
setflag = FALSE;
if (SOCKET_ERROR == setsockopt(handle, IPPROTO_TCP, TCP_NODELAY,
reinterpret_cast<char*>(&setflag), flagLength))
{
int error = WSAGetLastError();
printf("ERROR in getsockopt: errno: %d\n", error);
return error;
}
if (SOCKET_ERROR == getsockopt(handle, IPPROTO_TCP, TCP_NODELAY,
reinterpret_cast<char*>(&flag), &flagLength))
{
int error = WSAGetLastError();
printf("ERROR in getsockopt: errno: %d\n", error);
return error;
}
if(TRUE != flag && FALSE != flag)
{
printf("ERROR in getsockopt (default value): flag is invalid: %d, length is %d\n", flag, flagLength);
}
return 0;
}
Печать:
ERROR in getsockopt (default value): flag is invalid: -256, length is 1
ERROR in getsockopt (default value): flag is invalid: -255, length is 1
ERROR in getsockopt (default value): flag is invalid: -256, length is 1
Кто-нибудь может воспроизвести это? Примечание: я нахожусь на Win7, x64 Компиляция приложения x32 с VS2010.
Документация на getsockopt говорит, что я должен использовать BOOL
, Документация по IPPROTO_TCP говорит, что я должен использовать DWORD
, Однако оба не работает. Когда вы установите OPT_TYPE
к 8-битному типу (например, char
) оно работает. Я что-то пропустил в документации?