黑曜 2020-08-13 17:14 采纳率: 100%
浏览 159
已采纳

UDP发送数据长度小于16字节导致发送失败

用C实现的UDP发送代码,UDP数据16字节可以正常发送接收,一旦小于16字节便提示发送失败。

查阅了UDP协议并没有最小长度方面的限制,也用NetAssist网络助手软件发了数个字节的UDP包,抓包结果正常。但这段代码就是无法发送小于16字节的数据。

开发环境是CLion+minGW7.3.0,系统Win7专业版。

#include <winsock2.h>
//发送UDP数据
int udp_send() {
    sclient_PET = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    sin_pet.sin_family = AF_INET;
    sin_pet.sin_port = htons(4001);
    int len;
    //传送数据字节数
    //发送数据定义
    char recvData[255];
    auto UDPData_send = (char*)&recvData;
    //发送测试帧
    UDPData_send[0] = 0x88;
    UDPData_send[1] = 0x18;
    UDPData_send[2] = 0xFE;
    UDPData_send[3] = 0x10;
    UDPData_send[4] = 0x07;
    UDPData_send[5] = 0x00;
    UDPData_send[6] = 0x0A;
    UDPData_send[7] = 0x00;
    UDPData_send[8] = 0x0F;
    UDPData_send[9] = 0x00;
    UDPData_send[10] = 0x1E;
    UDPData_send[11] = 0x00;
    UDPData_send[12] = 0x32;
    char *sendData = (char*)UDPData_send;
    len = 15;//字节数

    sin_pet.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    int t = sendto(sclient_PET, sendData, len, 0, (sockaddr * ) & sin_pet, len);
    if (-1 == t)
        printf("UDP Send FAILURE!\n");
}


  • 写回答

2条回答 默认 最新

  • qiansen 2022-09-17 22:32
    关注

    sendto的最后一个参数不对,应该是sockaddr结构体的长度
    int t = sendto(sclient_PET, sendData, len, 0, (sockaddr * ) & sin_pet, len);
    改为
    int t = sendto(sclient_PET, sendData, len, 0, (sockaddr * ) & sin_pet, sizeof(sin_pet));

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 9月5日

悬赏问题

  • ¥15 晶体塑性有限元——Damask求解
  • ¥15 写出这个有没有人能写一下今天中午就要
  • ¥30 设计一个图形用户界面来控制你机械臂的运动
  • ¥30 3d打印机无法识别到SD卡,如何解决?(相关搜索:格式化)
  • ¥15 RPG游戏架构设计和开发方法
  • ¥15 前端返回pdf时不显示内容
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变