微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Winsock 套接字每次启动接收一个数据包

如何解决Winsock 套接字每次启动接收一个数据包

当我启动以下代码时,原始套接字会接收一个数据包。但是,此套接字上的 recvfrom() 的每次后续调用都会获得完全相同的数据包。

WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD(2,2);

err = WSAStartup(wVersionRequested,&wsaData);
if (err != 0) {
    std::cout << "Usable Winsock2 not found." << std::endl;
    return 22;
}
else {
    std::cout << "Initialized Winsock2.\n";
}

SOCKET listenSock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
if (listenSock == INVALID_SOCKET) {
    std::cout << "Failed socket creation. Error: " << WSAGetLastError() << std::endl;
}
else {
    std::cout << "Created socket.\n";
}

int socketoptionToSet = 1;
int socketoptionSetResult = setsockopt(listenSock,IPPROTO_IP,IP_HDRINCL,(char*)&socketoptionToSet,sizeof(int));
if (socketoptionSetResult) {
    std::cout << "Unable to set socket option. Error: " << WSAGetLastError() << std::endl;
}
else {
    std::cout << "Set socket option.\n";
}

sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(/*My local IP*/);
service.sin_port = htons(0);
memset(&(service.sin_zero),8);

int sockBindResult = bind(listenSock,(sockaddr *) &service,sizeof(service));
if (sockBindResult) {
    std::cout << "Unable to bind socket. Error: " << WSAGetLastError() << std::endl;
}
else {
    std::cout << "Bound socket.\n";
}

int inBuffer = 1;
DWORD receivedByteSize;
int socketModeResult = WSAIoctl(listenSock,SIO_RCVALL,&inBuffer,sizeof(inBuffer),&receivedByteSize,0);
if (socketModeResult) {
    std::cout << "Unable to set socket mode. Error: " << WSAGetLastError() << std::endl;
}
else {
    std::cout << "Set socket mode.\n";
}


char* socketBuffer = (char*)malloc(SOCKET_BUFFER_MAX);
memset(socketBuffer,SOCKET_BUFFER_MAX);
if (!socketBuffer) {
    std::cout << "No buffer space." << std::endl;
}
else {
    std::cout << "Created receiver buffer.\n";
}


bool stop = false;

int receiveResult = 1;

int latest = -1;
int prev = -1;

while (receiveResult > 0) {
    receiveResult = recvfrom(listenSock,socketBuffer,SOCKET_BUFFER_MAX,MSG_PEEK,0);
    if (receiveResult > 0) {
        printf("Bytes received: %d\n",receiveResult);
        prev = latest;
        latest = parseAndPrintSniffedPacket(socketBuffer,receiveResult);
        memset(socketBuffer,SOCKET_BUFFER_MAX);
    }
    else if (receiveResult == 0) {
        printf("Connection closed\n");
    }
    else {
        printf("recv Failed. Error: %d\n",WSAGetLastError());
    }
}

缓冲区确实被完全替换了;我尝试在每个周期释放和分配它,但没有帮助。

数据包在每个套接字的基础上被接收;每当收到重复的数据包时,我都会尝试创建一个套接字,在这种情况下,每个新套接字都会收到不同的数据包并继续接收相同的数据包。它很快就崩溃了(可能是因为我没有以任何方式关闭旧的套接字),总的来说,这似乎是一个糟糕的主意,所以我没有继续走这条路。

包括

#include <iostream>

#include <WinSock2.h>
#include <ws2tcpip.h>
#include <mstcpip.h>
#include <stdio.h>
#include <stdlib.h>

有什么明显我遗漏的地方吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。