2013-05-10 4 views
1

Есть ли способ управлять ОС (WIN7) для отправки больших данных (3 МБ и т. Д.), В 1 пакете с C++-сокетами?C++ отправка больших данных через сокет в 1 пакете

Я имею в виду отправки данных с помощью функции «отправить» без отдельного данных с большим количеством пакетов:

iResult = send(ConnectSocket, &vect[0], vect.size(), 0); // Sending The File 

(Im пытается отправить PNG-файл размером 3MB через сокеты). Спасибо.

+0

Почему вы хотите это сделать? – pilcrow

+0

Я не уверен, если вы здесь смущены. Вы действительно имеете в виду пакет * one * или хотите узнать, как отправить 3MB через сокет (через TCP?)? – Joe

+0

@pilcrow , потому что у меня проблема с распознаванием конца данных изображения (потому что я хочу отправить другие данные после этих данных), пока я получаю на моем сервере python, поэтому я думаю, что нашел решение, и решение разделяйте данные на отправку данных в другой пакет. – user2367115

ответ

3

Учитывая, что поле длины IP-пакета равно 2 байтам, нет. Ваш поток будет разбит на пакеты не более 65k. Но поскольку TCP является потоковым протоколом, это зависит от реализации способа форматирования и отправки пакетов. Вы гарантированно получите данные, отправленные вами в том порядке, в котором вы его отправили.

Если вы хотите узнать, где находится конец ваших отправленных данных, попробуйте сначала отправить размер данных, а затем прочитать этот объем данных.

unsigned int len = vect.size(); 
iResult = send(ConnectSocket, &len, sizeof(len), 0); // Sending The Length 
iResult = send(ConnectSocket, &vect[0], vect.size(), 0); // Sending The File 

Затем на приемной стороне:

unsigned int len; 
iResult = recv(socket, &len, sizeof(len), 0); 
// now you know how much data to read to get your png 

Также обратите внимание, что вы должны проверить, сколько отправляется во время каждого вызова send, поскольку он не должен отправить весь буфер в одном вызове. То же самое с recv. Возможно, вам придется позвонить recv несколько раз, чтобы прочитать все отправленные данные.

+0

спасибо, проблема решен. – user2367115

1

Наверное, нет. Буферы, используемые в winsock, имеют свои пределы. А на более низком (сетевом) уровне TCP/IP имеет свои ограничения на размер пакета.

1

TCP - это транспорт потока, а не пакетный транспорт, и вы никогда не получите гарантированный размер пакета. Кроме того, существуют ограничения по размеру, реализованные в программном и аппаратном обеспечении, способ ниже вашего желаемого размера.

Если вы хотите отправлять пакеты вместо потока, вы можете использовать UDP с собственными недостатками. И пакет, который большой, совершенно невозможно. См. What is the largest Safe UDP Packet Size on the Internet

+0

Хорошо. Хорошо, я попробовал несколько решений, таких как распознавание конца данных с помощью EOF char. но он не работает. есть ли у вас какие-либо другие решения для моей проблемы? – user2367115

+0

Ну, очевидно, вы передаете сумму, если сначала следуют байты, а затем полезная нагрузка. А затем на приемной стороне вы сидите и ждете, пока не соберете объем данных, которые были обещаны. TCP очень надежен в получении всех данных, которые вы отправили, в конечном итоге, в правильном порядке. – ypnos

1

Это явно звучит так, как будто вам нужно немного «протокола». Вам нужен способ рассказать другой конец, чего ожидать. Например, вы можете отправить первые четыре байта (или 8 байтов) пакета как «длину» всей передачи, за которой следует, например, 3 МБ данных. Принимающая сторона получает пакет в «start», который содержит длину данных, а затем переходит к извлечению всех данных, необходимых для этой передачи. Как только все данные будут получены, начните с получения длины, а затем зациклируйте до тех пор, пока все данные не будут получены для этого.

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