【EPOLL 非阻塞SOCKET READ 函数写法】
使用EPOLL进行SOCKET通讯的代码,网上资料写的不明确,专门写了测试代码进行测试,对READ中注意事项进行了总结。
一、LT模式下的READ
READ()返回值:
大于0,正常接收的数据
等于0, SOCKET关闭
等于-1 ,ERRNO == EINTR 重新调用READ( 可以立即调用,也可以退出等下一个LT的触发);ERRNO == EAGAIN 稍后调用(退出等下一个LT的触发,立即调用有可能空转);ERRNO == EWOULDBLOCK(和EAGAIN多数系统是同一值,同EAGAIN处理)
由于非阻塞SOCKET LT模式,READ退出后,只要有数据在SOCKET BUFFER中,就一定会持续LT触发,所以READ退出的判断条件,要求不严格。
示例代码如下:
int Socket_Read(int socketfd, char *buf, int buf_len )
{
int ret;
int num = 0;
int savenum = 0;
if ( NULL == buf )
{
printf("\n +++ [KLC_Socket_Read] pointer is null +++\n");
return(0);
}
while(1)
{
if ( buf_len == num )
{
printf("\n +++ [KLC_Socket_Read] buffer full +++\n");
return(num);
}
ret = read(socketfd, buf + num, buf_len-num);
if (ret == 0)
{