这是我的示例代码(对不起,它很长):
#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 上用 VS2010 编译 x32 应用程序。
getsockopt上的文档说我应该使用BOOL
. IPPROTO_TCP上的文档说我应该使用DWORD
. 但是两者都不起作用。当您设置OPT_TYPE
为 8 位类型(例如char
)时,它可以工作。我错过了文档上的某些内容吗?