如何解决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 举报,一经查实,本站将立刻删除。