发布网友 发布时间:2022-04-23 01:00
共3个回答
热心网友 时间:2023-09-27 02:39
是这样,如果是UDP传输,一般就是1500左右。如果是TCP大小不一定,比如你要传10000,有可能一次传的量是小于10000的任意量。
为了解决这个问题,我建议你用阻塞的SOCKET ,TCP传输,用一个循环接收一个大数据包,每次接到多少字节就将内存下表移动多少,在下次循环中继续接受,直到传完一个整包。
热心网友 时间:2023-09-27 02:40
如果你SOCKET发的数据报,比如UDP协议, 那么是有最大可发送大小.
这可以用下面这样getsockopt取得最大数据报大小.
----------------------------------------
SOCKET s;
int iSize, iVal, ret;
.....
iSize = sizeof(iVal);
ret = getsockopt(s, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&iVal, &iSize);
//-----------------------------------------
如果是TCP,则不需要这样做.
你send返回的字节数有801770个字节(是字节数吧!),和send里的规定length一样大,这可以表明你成功的将这些数据提交底层TCP协议栈去发送。
接收方要是处理成确的,是可以正确无误的收到这些数据的。
//---------------------------------------------
TCP 提供的是可靠的数据流服务 , 这意味着, 接收方,并不需要关心也不应该假定发送方调用了多少次SEND, 它只需要管的是通过若干次RECV把数据从协议栈的缓冲区读取出来。
TCP不必担心丢数据,但发送的时候,SEND要注意处理返回值,如果是阻塞方式,太多的数据会被阻塞, 如果是非阻方式,返回缓冲区满错,然后延时重发。
热心网友 时间:2023-09-27 02:40
..我用的socket一般都是分开发送。。每次就发送byte[65535] 知道发完。用的tcp
byte [] mBuffer = new byte[65535];
while ((mDataSend = mFileStream.Read(mBuffer, 0, 65535)) != 0)
{
socket.Send(mBuffer, mDataSend, SocketFlags.None);
}
接受跟他道理一样的