socket发送数据遇到的有关问题
socket发送数据遇到的问题?
socket是阻塞模式,超时设为5秒,socket缓冲区大小为默认,连续调用两次send:
send(...); // 一次性发送1MB数据
send(...); //发送5个字节
我用的是ADSL宽带,发送速度只有70KB/S左右,
但第一个send立即成功返回了,难道是把1MB数据都放在socket缓冲区中了?十几秒后接收方收到了这1MB数据。
第二个send返回超时错误(错误号: 0x0000274c),好像是在等待第一个send中的数据完成发送,请问这是什么原因,如何解决?
------解决思路----------------------
send 返回并不表示数据发送成功,它只表示数据被拷贝到了发送缓冲区,下面将有协议栈来完成物理传输过程。
当协议栈在发送数据时,发送缓冲区是锁定的,这时在往里面拷贝数据是不成功的;也就是说,在发送数据时,在send是会失败的。所以每次send都需要检查返回值。
------解决思路----------------------
struct timeval* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态:
第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;
第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;
第三,timeout的值大于0,这就是等待的超时时间,即 select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。
推荐你设置时间1秒左右 返回后如果返回值是0 说明没事件产生这时你可以sleep(20) 这种方式不会浪费cpu...
socket是阻塞模式,超时设为5秒,socket缓冲区大小为默认,连续调用两次send:
send(...); // 一次性发送1MB数据
send(...); //发送5个字节
我用的是ADSL宽带,发送速度只有70KB/S左右,
但第一个send立即成功返回了,难道是把1MB数据都放在socket缓冲区中了?十几秒后接收方收到了这1MB数据。
第二个send返回超时错误(错误号: 0x0000274c),好像是在等待第一个send中的数据完成发送,请问这是什么原因,如何解决?
------解决思路----------------------
send 返回并不表示数据发送成功,它只表示数据被拷贝到了发送缓冲区,下面将有协议栈来完成物理传输过程。
当协议栈在发送数据时,发送缓冲区是锁定的,这时在往里面拷贝数据是不成功的;也就是说,在发送数据时,在send是会失败的。所以每次send都需要检查返回值。
------解决思路----------------------
struct timeval* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态:
第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;
第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;
第三,timeout的值大于0,这就是等待的超时时间,即 select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。
推荐你设置时间1秒左右 返回后如果返回值是0 说明没事件产生这时你可以sleep(20) 这种方式不会浪费cpu...