Sockets 套接字错误的文件描述符
我想写一个多客户端套接字程序,Sockets 套接字错误的文件描述符,sockets,file-descriptor,Sockets,File Descriptor,我想写一个多客户端套接字程序, 但在接受阶段时,我得到了错误的文件描述符。 如何更正代码?谢谢 这是我的代码 谢谢 这是我的部分代码 while(1) { struct sockaddr_in client_addr; int addrlen = sizeof(client_addr); /*Accept*/ if(clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t
但在接受阶段时,我得到了错误的文件描述符。
如何更正代码?谢谢
这是我的代码
谢谢
这是我的部分代码
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);
}
while(1)
{
客户端地址中的结构sockaddr\u;
int addrlen=sizeof(客户地址);
/*接受*/
if(clientfd=accept(sockfd,(struct sockaddr*)和client_addr,(socklen_t*)和addrlen)<0)
{
perror(“Accpet错误”);
关闭(sockfd);
出口(-1);
}
/*分叉法*/
if(child=fork()<0)
{
perror(“分叉错误”);
关闭(sockfd);
出口(-1);
}
else if(子项==0)
{
int my_client=clientfd;
关闭(sockfd);
发送(我的客户,欢迎,sizeof(欢迎),0);
而((res=recv(我的客户机,buffer1,sizeof(buffer1),0))>0)
{
字符串命令(buffer1);
你的代码中有一些错误
首先,您需要在child
和clientfd
的赋值周围使用括号
行68
应更改为
if((clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen)) < 0)
此外,由于您已经关闭了侦听套接字,因此必须从分叉进程返回或退出()
因此,在第94行之后添加退出(0);
或返回0;
我强烈建议您在编译代码时启用警告,以便尽早发现分配问题。例如,如果您使用的是gcc
或g++
请在问题中包含代码的相关部分。代码板将随时消失。非常感谢,这对我来说非常有用,我会更正我的代码并重试。谢谢!!!!!!!!!现在,程序运行得很好,但还有一个问题是clientfd总是一个数字,服务器无法识别到底哪个客户端发送了什么消息,我如何修复它?谢谢!@ChengChung-Hao唯一区别客户端的是他们的IP广告dress:port,可通过getpeername()从套接字FD获取。
if((child = fork()) < 0)