socket的问题
非阻塞模式下send函数的问题
如send 1024字节 调用成功但是只发送部分如512字节的情况
望网络人士指点下!!
阻塞模式下又是怎样的?
[解决办法]
问题没写清楚啊
非阻塞模式下,函数返回时不能保证数据已发送,否则就是阻塞模式了
[解决办法]
你说的“只发送512”具体是什么意思呢?是send返回的值为512,还是对方只收到512?
如果是前者,那应该把512之后的部分通用send重新发送,直接完全发出为止;
如果是后者,那对方应该用recv继续接收,直到全部收到为止;如果无法全部收到那应该是网络发生故障了。
[解决办法]
使用writeN,继续发送剩余的数据
TCP使用滑动窗口处理数据缓冲,所以不论是否1次发送1024字节,还是多次发送总共1024字节,接收端都不能保证1次完整读出1024字节,不过TCP能保证数据的准确和完整,所以双方通信,可以使用
WriteN和ReadN
int SendN( SOCKET id,char * ptr,size_t count){ size_t n = 0; if( 0 == ptr || 0 >= count ) return SOCK_ERROR; while( n < count ) { int m = send( id,ptr,count-n,0); if( m < 0 ) { if( EINTR == errno ) { errno = 0; continue; } else break; } else { ptr = (char*)ptr + m; n += m; } } if( n == count) return SOCK_OK; else return SOCK_ERROR;}
[解决办法]
帮顶先~
[解决办法]
启用非阻塞模式send会有3种方式完成
1 系统有足够的空间缓冲所有数据,send将成功完成(写入所有数据),返回写入的字节数
2 缓冲区中没有足够的空间来写入整个请求,send将成功完成(写入尽可能多的数据),并返回能够写入的字节数
3 系统中没有空间来缓冲任何数据,send将会失败(不写入任何数据),并设置error
你的现象就是2,缓冲不足,无法全部写入
继续再send就行了