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;
}