czxt3000
czxt3000
采纳率100%
2020-04-13 12:51

请教WSAIoctl(.., SIO_RCVALL)监听网络, 返回10022,WinXP下可以,Win7下失败。

300
recSocket = socket(AF_INET, SOCK_RAW, IPPROTO_IP);  // WSASocket
if(recSocket == INVALID_SOCKET)
{
PrintInfo("\r\nsocket() error: %d", recSocket);
::WSACleanup();
nNetOK = -1;
return -2;
}

//setsockopt();.......set ip header

char hname[256];
struct hostent *pHost;
sockaddr_in addr;

if(gethostname(hname, sizeof(hname)) < -1)
{
PrintInfo("\r\ngethostname() error");
closesocket(recSocket);
recSocket = INVALID_SOCKET;
::WSACleanup();
nNetOK = -1;
return -3;
}
else
{
pHost = gethostbyname(hname);
addr.sin_addr = *(in_addr *)pHost->h_addr_list[0];
addr.sin_family = AF_INET;
addr.sin_port = htons(1234);    // >1024, IP层可填任意值

if(bind(recSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)
{
PrintInfo("\r\nbind() error");
closesocket(recSocket);
recSocket = INVALID_SOCKET;
::WSACleanup();
nNetOK = -1;
return -4;
}


#define SIO_RCVALL  (IOC_IN | IOC_VENDOR | 1)
u_long sio;
DWORD value;
if(WSAIoctl(recSocket, SIO_RCVALL, &sio, sizeof(sio), NULL, 0, &value, NULL, NULL) == SOCKET_ERROR)
{
                        前面都没问题,执行到这一步错误,错误下面为10022,系统为Win7_64,但是已经设置了管理员权限,应该没问题吧

int err= WSAGetLastError();


PrintInfo("\r\nWSAIoctl() error: %d", err );
closesocket(recSocket);
recSocket = INVALID_SOCKET;
::WSACleanup();
nNetOK = -1;
return -5;
}
      }
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • weixin_42375906 Rotch 1年前

    10022对应的错误是WSAEINVAL
    cmd不是一个合法的命令;或者一个输入参数非法;或者命令对于该种类型的套接口不适用。
    // 我先看看你的代码,稍后
    WSAStartup()写了吗?
    而且你的第二个参数好像不对
    第二个参数我记得是 SIO 开头的,你检查一下WSAIoctl函数的参数
    // 我有段时间没弄了,记不太清了,先去补补课
    目前来讲应该是参数错误,你先将它改成 SIO 控制试试

    点赞 评论 复制链接分享
  • q446002320 BMKB 1年前

    输入输出缓冲都换成2k看看,对划线应该接收任意中主机发来的信息,范围号0〜1024之间,系统中有特殊用途,最好将其替换1024以上,接收最佳定义为一个字符数组。

    点赞 评论 复制链接分享
  • dabocaiqq dabocaiqq 1年前