1
heiher 2014-09-28 11:36:23 +08:00 via Android
为什么读完才out?
|
2
heiher 2014-09-28 11:38:03 +08:00 via Android
|
3
qsun 2014-09-28 11:45:21 +08:00
socket设置成非堵塞,每次EPOLLIN事件发生都不停的读,直到read返回-1,并且 errono 是 EAGAIN 或者 EWOULDBLOCK,这样才代表socket中没有数据了。具体的可以看 READ(2)
另外,你说的一个数据块4k,socket并不会buffer这些数据,所以每次都去可能是4k可能不是4k,1~4k都是可能的。所以你需要人肉管理对应的接收到的数据buffer。 |
5
wudikua OP @qsun 你说的这个和我说的没关系啊,如何在非阻塞的SOCKET上READ我已经处理了,我的问题是我读了一个BUFFER,返回了已经读的字节数是BUFFER的长度,怎么知道返回读到的字节数是因为已经读完所以返回BUFFER_SIZE,还是因为还有数据所以返回BUFFER_SIZE
|
6
cloveryume 2014-09-28 13:03:28 +08:00
TCP?TCP没有读完的概念,除非说关闭。
TCP是一个流,肯定还要有更上一层的应用层协议,报头+报体,报头长度固定,内部有个字段表示报体的长度。可以甄别一个完整的报文。 |
7
heiher 2014-09-28 13:07:32 +08:00
@wudikua 你的这种情况是传输的数据是以一定的长度为一个 message 的,那你就增加 header 吧,然后在处理那边如果需要处理一个完整的 message 的话,只能使用一个 context 保存着 buffer list 或使用一个足够大的 buffer 存储 message。
|
8
wudikua OP @cloveryume 看来应该是这样~想再问个问题,报体如果不是一次WRITE,而是按照BUFFER分段WRITE,在服务器接收的时候是按照WRITE的顺序接收的么,还是可能会乱序,还得像TCP一样加个序号。
|
9
cloveryume 2014-09-28 16:56:11 +08:00
@wudikua 按照顺序,前提是中间没有穿插其他线程的写入。也需要检查write调用的返回值。
比较常见的一种做法是一个连接对应一个outbuf,写数据的时候写到这个outbuf里。 同时检测EPOLLOUT事件,可写时,就从outbuf里拿,往底层socket write。 |
10
songco 2014-09-29 13:44:02 +08:00
最好用第二种方式, tcp是流, 应用层协议要自己知道什么时候一个消息读完整了. 比如特殊的结束符, 比如先发四字节的长度.
如果消息是同步的, 应该有办法不加长度信息也能完成你说的, 不过比较麻烦, 如果是异步的就必须加了. |
11
luoqeng 2014-09-29 13:56:28 +08:00
一般的网络库读了数据之后要更新下写的回调函数
|