我在使用CSocket::Send(字符,长度);发送数据的时候,怎样把握长度的设置?怎么才能得到长度的最大值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在使用CSocket::Send(字符,长度);发送数据的时候,怎样把握长度的设置?怎么才能得到长度的最大值?相关的知识,希望对你有一定的参考价值。

在MFC程序中,我循环使用CSocket::Send(字符,长度);发送数据,
对方也循环使用CSocket::Receive(字符,长度);接受数据,
但传送的速度远远小于我上网的速度,我的程序中两边默认传送字符的长度都是1024字节,是不是这个数字设置的太小的原因?
怎样把握长度的设置?怎么才能得到传送长度的最大值?
请问我的软件传送速度慢的根本原因在哪里呢?

可以使用多线程传送同时设置缓冲区大小
3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:

int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节
(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据
和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:

// 接收缓冲区
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响
程序的性能:

int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));

6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):

int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
参考技术A 你可以定义一个足够大的BUFFER,然后都一次send,如果成功,send会返回实际发送的数量.也就是说没把buffer都发了,然后计算了下一个应该发的地方,再发送。
其实TCP/IP的一个数据报本身长度就有限制的,太大了也没用,最后还是分包发的。但是如果buffer太小,比如2个字节,那么就浪费了网络资源。

另外如果快的话可以考虑下多线程,但是数据结构设计的可能就比较复杂了。你现在的方式应该是用一个socket进行连接传输的,如果数据特别多,可以用多个socket考虑下。....
参考技术B 你的上网速度,和你传送的速度无关,,因为你不能确保你传送给的对象速度也快.
另外你的缓冲区大小也无关,因为windows收到数据你先存入自己的缓冲区,你只是从windows的缓冲区中读数据,和写入数据到Windows的缓冲区而已.

以上是关于我在使用CSocket::Send(字符,长度);发送数据的时候,怎样把握长度的设置?怎么才能得到长度的最大值?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery验证字符串长度预先替换字段字符

别人在那看漫画,我在LeetCode刷算法:最后一个单词的长度

计算表情符号的字符长度?

获取 DataTable 列字符表示的最大长度

找出一个可变长度的字符串?

ORA-01704 错误,插入长度超过 4000 个字符的字符串