当前位置: 技术问答>linux和unix
一个简单的sock i/o程序,客户端用epoll,使得服务端出错了,太奇怪了!
来源: 互联网 发布时间:2017-02-06
本文导语: 一个程序里面,父进程是服务器端,创建一个子进程当客户端。 服务器端每隔1s钟发送一个消息,子进程接受并打印出来。 但我运行的结果却是: Server: Accepted! Server: data sent=1 Client: Connected Server: send error 代码的...
一个程序里面,父进程是服务器端,创建一个子进程当客户端。
服务器端每隔1s钟发送一个消息,子进程接受并打印出来。
但我运行的结果却是:
Server: Accepted!
Server: data sent=1
Client: Connected
Server: send error
代码的问题在哪儿? 我怀疑我epoll模型用的不对。网上说epoll_wait之后要重新epoll_ctl,这个是可选的还是必须做的?
服务器端每隔1s钟发送一个消息,子进程接受并打印出来。
但我运行的结果却是:
Server: Accepted!
Server: data sent=1
Client: Connected
Server: send error
代码的问题在哪儿? 我怀疑我epoll模型用的不对。网上说epoll_wait之后要重新epoll_ctl,这个是可选的还是必须做的?
#include
#include
#include
#include
#include
#include
#include
#include
void server(void)
{
int sockSrv=socket(AF_INET,SOCK_STREAM,0);
if(sockSrv==-1)return;
sockaddr_in sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port =htons(34567);
sAddr.sin_addr.s_addr =htonl(INADDR_ANY);
if(-1 == bind( sockSrv, (sockaddr*)&sAddr, sizeof( sockaddr )))return;
if(-1 == listen(sockSrv,0))return;
socklen_t cbAddr = sizeof(sockaddr);
while(1){
int iAccSock = accept(sockSrv, (sockaddr*)&sAddr, &cbAddr );
if(iAccSock==-1)return;
printf("Server: Accepted!n");
long i=0;
while(1){
char buf[6]={0};
sprintf(buf,"%d",++i);
if(-1 == send(iAccSock,buf,strlen(buf),0) ){
printf("Server: send errorn");
close(iAccSock);
break;
}
printf("Server: data sent=%sn",buf);
sleep(1);
}
close(iAccSock);
}
}
int createPoll(int hClient)
{
int fd_epoll = epoll_create(1);
if(fd_epoll==-1)
{
printf("epoll_create failedn");
return 0;
}
epoll_event ee;
ee.events=EPOLLIN;
int ret=epoll_ctl(fd_epoll,EPOLL_CTL_ADD,hClient,&ee);
if(ret==-1)
{
printf("epoll_ctl failedn");
return 0;
}
while(true)
{
int fd=epoll_wait(fd_epoll,&ee,1,-1);
if(fd=recv(hClient,buf,sizeof(buf),0)){
printf("Client: recv errorn");
break;
}
printf("Client: recv=%sn",buf);
}
}
}//end while
}
void client(void)
{
int hClient=socket(AF_INET,SOCK_STREAM,0);
if(hClient==-1)return;
sockaddr_in sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port =htons(34567);
sAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if( -1==connect( hClient, (sockaddr*)&sAddr, sizeof(sockaddr) ) )
{
printf("Client: Async connect errorn");
return;
}
printf("Client: Connectedn");
close(hClient);
return;
}
int main(void)
{
pid_t pid=fork();
if(pid==0)
{//child
sleep(1);
client();
}
else//father
{
server();
}
return 0;
}
|
客户端没有调用 createPoll() ?