当前位置:  技术问答>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,这个是可选的还是必须做的?

#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() ?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下有没有使得socks5可以级连的代理工具
  • java命名空间java.net枚举proxy.type的类成员方法: socks定义及介绍
  • SOCKS服务器 Socks Server 5
  • 跨平台的socks服务器 socks_server
  • sock_raw和sock_packet的问题
  • 帮忙看一下应该服务端建sockfd用SOCK_DGRAM还是SOCK_STREAM??
  • 套接字中,第二个参数SOCK_RAW 与SOCK_PACKET 有什么区别
  • err=sock->ops->setsockopt(sock, SOL_SOCKET, ...);返回值代表的含义?
  • 代理服务器 Socks5
  • 【求助】我刚装REDHAT9,用SOCK函数总返回-1
  • 如何通过http代理实现socks代理?
  • Linux下socks5如何设置?
  • 关于socks5的问题,总是死...why?
  • 多个sock同时监听一个port
  • 调用sock_create,为什么会返回-13?
  • 谁有Socks服务器的压缩包,送我一个吧
  • 关于linux下面的sock5到http的转换工具!
  • Socks代理上网工具 tsocks
  • 那里有socks5-v1.0r11.tar.gz下载?
  • SOCKS代理服务器 Dante
  • 代理服务器 node-socks
  • sock编程高手救救小弟!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3