【问题标题】:Winsock UDP filesending error 10040Winsock UDP 文件发送错误 10040
【发布时间】:2013-07-14 08:15:07
【问题描述】:

这是我的发送程序。

#pragma once
#pragma comment(lib,"Ws2_32.lib")

#include <WinSock2.h>
#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
    WSAData wsaData;
    WORD DllVersion = MAKEWORD(2,2);
    int startup_RetVal = WSAStartup(DllVersion, &wsaData);

    SOCKET sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    SOCKADDR_IN addr;

    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_family = AF_INET;
    addr.sin_port = htons(22222);

    char buf[200000] = "AR*REF=";

    int send_RetVal = sendto(sSocket, buf, 200000, NULL, (SOCKADDR*)&addr, sizeof(addr));
    if(send_RetVal == SOCKET_ERROR)
    {
        cout <<" An error occured " << WSAGetLastError() << endl;
        getchar();
    }

    return 0;
}

我收到 WSAEMSGSIZE (10040) 错误。

目标是通过 udp 发送一个 100Kbytes 的文件。有人告诉我,.NET 上的类似错误已通过这种方式解决:

IPHostEntry^ IPHostTV;

IPEndPoint^ send_tv_ip;

Socket^ UDPSendTV;

int PortSendTV;
System::String^ IPSend;



send_tv_ip =
gcnew IPEndPoint(IPHostTV->AddressList[0], PortSendTV);

UDPSendTV =
gcnew Socket(send_tv_ip->Address->AddressFamily, SocketType::Dgram, ProtocolType::Udp);

//Increasing buffer and timeout
UDPSendTV->SendTimeout = 1000;
UDPSendTV->SendBufferSize = 100000;

UDPSendTV->SendTo(buff1, 0, size1, SocketFlags::None, send_tv_ip);

如何修改我的套接字以使其正常工作?

【问题讨论】:

    标签: c++ udp winsock


    【解决方案1】:

    UDP 上的消息大小受协议限制,由 UDP 标头中的 16 位消息大小字段限制为 ~64KB。没有解决方法。

    (好吧,除了每个协议单元发送多条消息)。

    【讨论】:

    • 那我该怎么做呢?那么这是什么UDPSendTV-&gt;SendTimeout = 1000; UDPSendTV-&gt;SendBufferSize = 100000;
    • @user1744577:我不是 .NET 专家,但这看起来像设置套接字的发送超时和发送缓冲区大小,仍然不允许您发送大于 64KB 的 UDP 数据包。跨度>
    • @user1744577 在 UDP 之上实现一些文件传输协议。您将不得不处理可能的消息丢失和无序接收的消息,即重新实现大部分 TCP。当然,您可以直接切换到 TCP,这是其他人用于文件传输的方式。
    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2020-01-07
    相关资源
    最近更新 更多