使用raw socket组包发送udp的包,总是报10049错误!
全部分数都在这里,有解决的立即结贴
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
#pragma pack(1)
// The IP header structure
//
typedef struct _iphdr
{
unsigned char h_len:4; // Length
unsigned char ver:4; // IP Version
unsigned char tos; // Type of service
unsigned short totlen; // Total length of the packet
unsigned short id; // Unique identifier
unsigned short offset; // Fragment offset field
unsigned char ttl; // Time to live
unsigned char proto; // Protocol(TCP,UDP,ICMP,IGMP...)
unsigned short checksum; // IP checksum
unsigned int srcIP; // Source IP address
unsigned int destIP; // Destination IP address
}IpHeader, * LPIpHeader;
// The UDP header structure
//
typedef struct _udphdr
{
unsigned short sport; // Source Port
unsigned short dport; // Destination Port
unsigned short Length; // Length
unsigned short Checksum; // Checksum
}UdpHeader, * LPUdpHeader;
typedef struct _PSHeader
{
unsigned long srcaddr;
unsigned long destaddr;
unsigned char zero;
unsigned char protocol;
unsigned short len;
}PSHeader;
#pragma pack()
int initialize();
USHORT checksum(USHORT *buffer, int size);
void main()
{
initialize();
SOCKET sock = socket(AF_INET,SOCK_RAW,IPPROTO_UDP);
SOCKADDR_IN sock_addr;
BOOL on = 1;
int ret = setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on));
if (ret == SOCKET_ERROR){
printf("Error setting opt: %d",WSAGetLastError());
return;
}
unsigned char sendBuf[2048];
memset(sendBuf,0,2048);
unsigned char chksumBuf[2048];
memset(chksumBuf,0,2048);
int chksumLen = 0;
unsigned char data[20];
memset(data,0,20);
strcpy((char*)data,"Hello");
int data_size = strlen((char*)data) + 1;
IpHeader *iphdr;
UdpHeader *udphdr;
int iUdpSize, error;
PSHeader pseudo_header;
iphdr = (IpHeader *) sendBuf; // the ip header now points to the top of the sendBuf
udphdr=(UdpHeader *) (sendBuf + sizeof(IpHeader)); // the udp header points to the part next to the ip header
memcpy(sendBuf+sizeof(IpHeader)+sizeof(UdpHeader),data, data_size);
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons (80);
sock_addr.sin_addr.s_addr = inet_addr("192.168.0.8");
iphdr->ver = 4;
iphdr->h_len = 5;
iphdr->tos = 0;
iphdr->totlen = sizeof (IpHeader) + sizeof (UdpHeader) + data_size;
iphdr->id = 1;
iphdr->offset = 0;
iphdr->ttl = 255;
iphdr->proto = IPPROTO_UDP; //UDP
iphdr->checksum = 0;
iphdr->srcIP = inet_addr ("192.168.0.81"); // your source id
iphdr->destIP = sock_addr.sin_addr.s_addr;
// Initalize the UDP header
//
iUdpSize = sizeof(UdpHeader) + data_size;
udphdr->sport = htons(5150) ;
udphdr->dport = htons(5150) ;
udphdr->Length = htons(iUdpSize) ;
udphdr->Checksum = 0 ;
//calculate UDP CheckSum
pseudo_header.destaddr = inet_addr("192.168.0.8");
pseudo_header.srcaddr = inet_addr("192.168.0.81");
pseudo_header.zero = 0;
pseudo_header.protocol = IPPROTO_UDP;
pseudo_header.len = udphdr->Length;
memcpy(chksumBuf,(PVOID)&pseudo_header,sizeof(pseudo_header));
chksumLen += sizeof(pseudo_header);
memcpy(chksumBuf+chksumLen,udphdr,sizeof(UdpHeader));
chksumLen += sizeof(UdpHeader);
memcpy(chksumBuf+chksumLen,data,data_size);
chksumLen += data_size;
udphdr->Checksum = checksum((unsigned short*) chksumBuf,chksumLen);
iphdr->checksum = checksum((unsigned short *) iphdr, sizeof(IpHeader));
/*for(int i=0;i<40;i++)
printf("%x",sendBuf[i]);*/
error = sendto(sock,(char*)sendBuf,28+data_size,0,(LPSOCKADDR)&sock_addr,sizeof(SOCKADDR_IN));
if(error == SOCKET_ERROR)
cout << WSAGetLastError() << endl;
else
cout << "sent" << endl;
}
int initialize()
{
int t;
/* Before any Winsock function to work, we need to call to wsock.dll to initialize those
functions */
WSADATA wsa_data;
t = WSAStartup(MAKEWORD(2,2), &wsa_data);
if(t != 0)
return -1;
else
return 0;
}
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
相关推荐
四驱PHEV、插电式混合动力汽车+DM混动系统P2+P4+发动机(三擎四驱)Matlab仿真
内容概要:本文系统解读了一套完整的多机器人路径规划(MAPF)MATLAB代码库,旨在解决在共享环境中为多个智能体寻找无冲突路径的核心问题。文章采用几何、拓扑、调度与呈现四层架构,详细阐述了地图解析、四邻域拓扑与Petri网构建、基于优先级启发式的路径规划、时间同步与冲突消解,以及可视化等关键技术环节。核心设计思想为空间规划与时间消解分离,通过动态边权膨胀、节点预留历史、几何惩罚驱动的局部同步等机制有效提升算法效率与可扩展性。文中深入分析了三种时间同步策略的适用场景与性能取舍,并强调了可视化在算法验证中的关键作用,为构建可复现、可扩展的MAPF仿真系统提供了详尽的技术参考。; 适合人群:具备一定MATLAB编程基础,从事机器人、自动化、智能交通、无人机编队等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习并掌握多机器人路径规划中的优先级规划与冲突消解核心算法;② 理解并应用基于Petri网的整数规划求解方法;③ 构建并优化可复现、可扩展的MAPF仿真系统,服务于仓储物流、自动驾驶、无人机集群等实际应用场景;④ 提升MATLAB工程化开发能力与复杂算法的可视化水平。; 阅读建议:建议读者结合提供的MATLAB代码与MovingAI标准地图数据,严格按照章节顺序逐步实践,重点关注各模块间的接口设计、性能优化策略及“信息前移”的工程思想,并通过调整智能体数量、地图复杂度等参数,全面验证算法的鲁棒性与效率。
产业园区运营负责人如何利用平台提升园区内企业与科研机构的协同创新能力?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
Delphi 13.2控件之Delphi37Binaries-2026.48-windows.pak
Delphi 13.2控件之Delphi37Binaries-2026.48-windows.pak
政府科技管理者在推动科技成果转化时,如何精准匹配科技资源与产业需求?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
高校技术转移办公室人员如何高效管理科研成果并推动转化?.docx
高校技术转移办公室人员如何高效管理科研成果并推动转化?


网络编程
