2013-07-14 3 views
0

Это моя программа отправки.Ошибка аутентификации Winsock UDP 10040

#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).

Целью является отправить файл размером 100 Кбайт по udp. Мне сказали, что аналогичная ошибка в .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); 

Как изменить мои сокеты, чтобы они работали правильно?

ответ

2

Размер сообщения по UDP ограничен протоколом до ~ 64 КБ по 16-разрядному размеру сообщения в заголовке UDP. Нет обходного пути.

(ну, кроме отправки нескольких сообщений на единицу протокола).

+0

Итак, как мне это сделать? И что это такое, тогда 'UDPSendTV-> SendTimeout = 1000; UDPSendTV-> SendBufferSize = 100000; ' – user1744577

+0

@ user1744577: Я не эксперт .NET, но это похоже на настройку тайм-аута отправки сокета и размера буфера отправки, который по-прежнему не позволит вам отправлять UDP-пакеты размером более 64 КБ. – Hasturkun

+0

@ user1744577 реализовать некоторый протокол передачи файлов поверх UDP. Вам придется обрабатывать возможные потери сообщений и получать сообщения вне порядка, т. Е. Повторно выполнять большую часть TCP. Вы могли бы, конечно, просто переключиться на TCP, что все остальные используют для передачи файлов. –

Смежные вопросы