设为首页 加入收藏

TOP

I/O multiplexing 与 非阻塞网络编程(二)
2014-11-24 01:04:16 来源: 作者: 【 】 浏览:7
Tags:I/O multiplexing 阻塞 网络编程
d = Accept(listenfd,&cli_addr);


printf("recieve from : %s at port %d\n", inet_ntop(AF_INET,&cli_addr.sin_addr,addr_str,INET_ADDRSTRLEN),cli_addr.sin_port);


for(ix = 0; ix < static_cast(client.size()); ix++)
{
if(client[ix] < 0)
{
client[ix] = connfd;
break;
}
}


printf("client[%d] = %d\n",ix,connfd);


if( FD_SETSIZE == ix)
{
printf("too many client! \n");
exit(1);
}


if( connfd > maxfd)
{
maxfd = connfd;
}


FD_SET(connfd, &allset);


accepted++;
printf("accepted: %d\n",accepted);


if(ix > maxid)
{
maxid = ix;
}

if(--nready == 0)
{
continue;
}


}


for(ix = 0; ix <= maxid; ix++)
{
if((sockfd = client[ix]) < 0)
{
continue;
}


if(FD_ISSET(sockfd,&rset))
{

int left_len = bufMap[sockfd].length();

if( 0 == (nrcv = Read(sockfd,bufMap)))
{
client[ix] = -1;
printf("close! \n");
FD_CLR(sockfd,&allset);
bufMap.erase(sockfd);
close(sockfd);
}
else if ( nrcv > 0)
{
printf("nrcv = %d \n",nrcv);


nrcv += left_len;//next time when client write to


//nwrt = write(sockfd,bufMap[sockfd].c_str(),200);// 模拟还有剩余
nwrt = write(sockfd,bufMap[sockfd].c_str(),nrcv);


if(nwrt < 0)
{
if( errno != EWOULDBLOCK)
{
printf("Write error: %s\n", strerror(errno));
}
}


printf("nwrt = %d \n",nwrt);


if(nwrt == nrcv) // 全部写到了内核缓冲区
{
bufMap[sockfd].clear();
//bufMap[sockfd].erase(0,nrcv);
if(FD_ISSET(sockfd,&wrset))
{
FD_CLR(sockfd,&wrset);
}
}
else // 还有剩余
{
printf("write left \n");
bufMap[sockfd].erase(0,nwrt);
std::cout << " after erase: "< FD_SET(sockfd,&wrset);//开始关注写事件
}


}
else
{
int err = getSocketError(sockfd);

printf("SocketError: %s\n",strerror(err));
}
}


if(FD_ISSET(sockfd,&wrset))
{
nrcv = bufMap[sockfd].size();
printf("write again: nrcv left = %d \n",nrcv);
nwrt = write(sockfd,bufMap[sockfd].c_str(),nrcv);


if(nwrt == nrcv)
{
bufMap[sockfd].clear();
if(FD_ISSET(sockfd,&wrset))
{
FD_CLR(sockfd,&wrset);
}
printf("Write complete! \n");
}
else
{
bufMap[sockfd].erase(0,nwrt);
}
}


if(--nready == 0)
{
break;
}
}
}


return 0;
}


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux字符驱动中动态分配设备号与.. 下一篇Linux Socket 编程I/O Multiplexi..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: