Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 套接字错误的文件描述符_Sockets_File Descriptor - Fatal编程技术网

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)