我想写一个多客户端套接字程序,
但是当接受阶段我得到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 :(得分:2)
您的代码中存在一些错误
首先,您需要在child
和clientfd
的作业周围使用括号。
行68
应更改为
if((clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen)) < 0)
和第76
行应为
if((child = fork()) < 0)
此外,您必须从分叉流程return
或exit()
,因为您已经关闭了侦听套接字。
所以在第exit(0);
行
return 0;
或94
我强烈建议您在启用警告的情况下编译代码,以便及早发现分配问题。例如,如果您使用-Wall
或-Wextra
gcc
和g++
标记