c - Socket Programming in C : When client exit server, 服务器崩溃

标签 c sockets

我运行一个套接字编程代码,用于多个客户端与一台服务器的通信。一切都正常进行,但是当我 ctrl C 退出其中一个客户端时,服务器没有按我预期的那样显示。下面是代码:

客户端.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 4444

int main(){

    int clientSocket, ret;
    struct sockaddr_in serverAddr;
    char buffer[1024];

    clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    if(clientSocket < 0){
        printf("[-]Error in connection.\n");
        exit(1);
     }
     printf("[+]Client Socket is created.\n");

     memset(&serverAddr, '\0', sizeof(serverAddr));
     serverAddr.sin_family = AF_INET;
     serverAddr.sin_port = htons(PORT);
     serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    ret = connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
    if(ret < 0){
         printf("[-]Error in connection.\n");
         exit(1);
     }
     printf("[+]Connected to Server.\n");

     while(1){
        printf("Client: \t");
        scanf("%s", &buffer[0]);
        send(clientSocket, buffer, strlen(buffer), 0);

        if(strcmp(buffer, ":exit") == 0){
            close(clientSocket);
            printf("[-]Disconnected from server.\n");
            exit(1);
        }

        if(recv(clientSocket, buffer, 1024, 0) < 0){
            printf("[-]Error in receiving data.\n");
        }else{
            printf("Server: \t%s\n", buffer);
        }
    }

    return 0;
}

服务器.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 4444

int main(){

    int sockfd, ret;
    struct sockaddr_in serverAddr;

    int newSocket;
    struct sockaddr_in newAddr;

    socklen_t addr_size;

    char buffer[1024];
    pid_t childpid;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0){
        printf("[-]Error in connection.\n");
        exit(1);
    }
    printf("[+]Server Socket is created.\n");

    memset(&serverAddr, '\0', sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    ret = bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
    if(ret < 0){
        printf("[-]Error in binding.\n");
        exit(1);
    }
    printf("[+]Bind to port %d\n", 4444);

    if(listen(sockfd, 10) == 0){
        printf("[+]Listening....\n");
    }else{
        printf("[-]Error in binding.\n");
    }


    while(1){
        newSocket = accept(sockfd, (struct sockaddr*)&newAddr, &addr_size);
        if(newSocket < 0){
            exit(1);
        }
        printf("Connection accepted from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));

        if((childpid = fork()) == 0){
            close(sockfd);

            while(1){
                recv(newSocket, buffer, 1024, 0);
                if(strcmp(buffer, ":exit") == 0){
                    printf("Disconnected from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));
                    break;
                }else{
                    printf("Client: %s\n", buffer);
                    send(newSocket, buffer, strlen(buffer), 0);
                    bzero(buffer, sizeof(buffer));
                }
            }
        }

     }

    close(newSocket);


    return 0;
}

当我按 ctrl C 退出客户端时。在服务器端,它显示:

Client:
Client:
Client:
Client:

它似乎永远循环“Client:”而不是显示 printf“Disconnected from...”的消息,并继续按照我的预期与其他客户端一起工作。我从 youtube 上看这段代码,他们可以在视频中正确运行它,但我不知道为什么当我下载这段代码并在我的电脑上运行时,它会出现这个问题。谁能帮我解决这个问题,以便服务器可以打印消息“断开连​​接...”。谢谢。

最佳答案

When I press ctrl C to exit the client. On the server side, it shows:

Client:
Client:
Client:
Client:

and it's seem to loop "Client:" forever instead of showing message of printf"Disconnected from..." and continue to work with other clients as I expected.

您的代码仅在收到来自客户端的“:exit”消息时才会打印断开连接消息并退出循环。如果您使用 Ctrl-C 终止客户端,则它会终止而不发送任何此类消息。

健壮的服务器代码会检查 recv() 调用的返回值,它会返回 -1 以表示错误。您的服务器会忽略它,只是尝试一次又一次地读取。尽管您不能指望在客户端消失的每种情况下都会出现错误,但您的服务器不断打印“Client:”这一事实表明您在这种情况下会出现错误。

I look at this code from on youtube, they can run it properly in the video but I do not know why when I download this code and run on my computer, it gets that problem.

要么他们在视频中演示的内容与您提供的代码不同(也许视频对此具有欺骗性),要么他们通过键入“:exit”命令退出了客户端,而不仅仅是杀死客户端。

关于c - Socket Programming in C : When client exit server, 服务器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53094542/

相关文章:

c - 如何更新 includePath. #include 检测到的错误

flash - 用于浏览器和 Flash 的 Node.js 和套接字

c - 如何在 POSIX C 中枚举连接到机器的所有 IP 地址?

python - 使用套接字分别发送 2 条消息

sockets - 知道基本加密聊天的任何好例子吗? (GnuTLS?)

将均匀分布转换为泊松分布

c - 尝试从 argv 打开文件时 fopen 返回 NULL

java - 我如何才能知道在我的操作系统上进行上下文切换需要多长时间?

c - OpenMP:首先完成第一次迭代

无法将 TCP 套接字添加到使用 SDL_NET 设置的套接字