2012-11-08 40 views
0

我想写一个多客户套接字程序,
但是当accept阶段我得到Bad文件描述符。
我该如何纠正我的代码?谢谢!
套接字坏文件描述符

这里是我的代码
http://codepad.org/q0N1jTgz
谢谢!
这是我的部分代码!

while(1) 
{ 
    struct sockaddr_in client_addr; 
    int addrlen = sizeof(client_addr); 

    /*Accept*/ 
    if(clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen) < 0) 
    { 
     perror("Accpet Error"); 
     close(sockfd); 
     exit(-1); 
    } 

    /*Fork process*/ 
    if(child = fork() < 0) 
    { 
     perror("Fork Error"); 
     close(sockfd); 
     exit(-1); 
    } 
    else if(child == 0) 
    { 
     int my_client = clientfd; 
     close(sockfd); 

     send(my_client, welcome, sizeof(welcome), 0); 

     while ((res = recv(my_client, buffer1, sizeof(buffer1), 0)) > 0) 
     { 
      string command(buffer1); 
      cout << "receive from client:" << command << ", " << res << " bytes\n"; 
      memset(buffer1, '\0', sizeof(buffer1));  
     } 
    } 

    close(clientfd); 

} 
+0

通过[编辑它(http://stackoverflow.com/posts/13287359/edit)请在你的问题你的代码的相关部分。键盘将随时消失。 – 2012-11-08 10:59:21

回答

1

有代码中的一些错误 首先你需要周围使用分配括号childclientfd

线68应改为

if((clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen)) < 0) 

和线76应该

if((child = fork()) < 0) 

还必须从既然你已经关闭了监听套接字分叉过程returnexit()

行之后所以加exit(0);return 0;94

我强烈建议你启用了警告编译代码,以便及早发现的分配问题。 e.g使用-Wall-Wextra标志,如果你正在使用gccg++

+0

非常感谢你,这对我非常有用,我会纠正我的代码并重试它。谢谢!!!!!!!!!! – Andy

+0

现在,该程序工作完美,但还有一个问题是,clientfd始终是一个相同的号码,服务器无法识别究竟哪个客户端发送消息,我该如何解决它?谢谢! – Andy

+0

@ ChengChung-Hao唯一区分客户端的是他们的IP地址:端口,您可以通过getpeername()从套接字FD获取端口。 – EJP

相关问题