C 语言socket 的send数据太大,最大能发送多少?如何分批发送? 35
先谢谢了!不过我是用TCP的,那么TCP怎么弄?它的IP包是最大是多少个字节?网上有些是1500字节,也有些是更大的,我都不知道哪个才是对的?现在我想知道C语言的sock...
先谢谢了!不过我是用TCP的,那么TCP怎么弄?它的IP包是最大是多少个字节?网上有些是1500字节,也有些是更大的,我都不知道哪个才是对的?现在我想知道C语言的socket能发多大?因为我现在发送的数据好大,如果不能,那如何分批发送?希望有个很好的答案!!最好有例子!
我测试了一下,send返回的字节数有801770个字节(是字节数吧!),和send里的规定length一样大,是不是就代表send成功地发送了那么多个字节的数据?
halfyawn 你好! 我的接收方(VB做的程序)一次只能接收8192个字节,而发送方是不断的采集数据并发送的,这样两边根本很难协调,由传感器采集的数据是不断地放在一个buffer里,然后send也可以发送那么多,可接收方再怎么分段接收也接不了那么快,所以我怕数据丢失,因此我想把采集到的数据放在一个大Buffer里,然后send从Buffer里取一部分发送,想请教一下这个Buffer该怎么定义,send那边又该如何写,这样传感器在采集数据(这个数据很庞大^_^),而send在发送,取多少发多少,两者不相干。我是一个初学者,还望多多指教! 展开
我测试了一下,send返回的字节数有801770个字节(是字节数吧!),和send里的规定length一样大,是不是就代表send成功地发送了那么多个字节的数据?
halfyawn 你好! 我的接收方(VB做的程序)一次只能接收8192个字节,而发送方是不断的采集数据并发送的,这样两边根本很难协调,由传感器采集的数据是不断地放在一个buffer里,然后send也可以发送那么多,可接收方再怎么分段接收也接不了那么快,所以我怕数据丢失,因此我想把采集到的数据放在一个大Buffer里,然后send从Buffer里取一部分发送,想请教一下这个Buffer该怎么定义,send那边又该如何写,这样传感器在采集数据(这个数据很庞大^_^),而send在发送,取多少发多少,两者不相干。我是一个初学者,还望多多指教! 展开
3个回答
展开全部
如果你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要注意处理返回值,如果是阻塞方式,太多的数据会被阻塞, 如果是非阻方式,返回缓冲区满错,然后延时重发。
这可以用下面这样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要注意处理返回值,如果是阻塞方式,太多的数据会被阻塞, 如果是非阻方式,返回缓冲区满错,然后延时重发。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
..我用的socket一般都是分开发送。。每次就发送byte[65535] 知道发完。用的tcp
byte [] mBuffer = new byte[65535];
while ((mDataSend = mFileStream.Read(mBuffer, 0, 65535)) != 0)
{
socket.Send(mBuffer, mDataSend, SocketFlags.None);
}
接受跟他道理一样的
byte [] mBuffer = new byte[65535];
while ((mDataSend = mFileStream.Read(mBuffer, 0, 65535)) != 0)
{
socket.Send(mBuffer, mDataSend, SocketFlags.None);
}
接受跟他道理一样的
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询