Опция сокета 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) оно работает. Я что-то пропустил в документации?

0 ответов

Другие вопросы по тегам