【问题标题】:TCP echo server doesn't accept clientTCP 回显服务器不接受客户端
【发布时间】:2020-08-27 01:11:12
【问题描述】:

我正在尝试在 C 中创建一个 echo 客户端服务器。问题是,当我启动服务器并运行客户端代码时,在客户端 shell 中它显示“已连接”,但在服务器 shell 中它仍然显示“等待连接” ”。 (服务器没有说“接受失败”。它永远说“等待连接”)。我认为服务器不接受客户端,因此如果我从客户端外壳写任何东西,它就不会回来。

如果我能得到任何帮助,我将不胜感激。

这是服务器代码:

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int socket_desc, client_sock, c, read_size;
    struct sockaddr_in server, client;
    char client_message[2000];

    //create socket
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    if(socket_desc == -1)
    {
        printf("Socket couldn't created\n");
    }

    puts("Socket created");

    //prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    //bind
    if( bind(socket_desc,(struct sockaddr *)&server, sizeof(server)) < 0)
    {
        //print the error message
        perror("bind failed");
        return 1;
    }
    puts("bind done");

    //Listen
    listen(socket_desc , 3)


    //Accept and incoming connection
    puts("Waiting for incoming connections...");
    c = sizeof(struct sockaddr_in);

    while(1)
    {
        //accept connection from an incoming client
        client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t *)&c);
        if(client_sock < 0)
        {
            perror("accept failed");
            return 1;
        }
    }
    puts("Connection accepted");

    //Recieve message from client
    while( (read_size = recv(client_sock , client_message , 2000 , 0))>0)
    {
        //Send the message back to client
        write(client_sock , client_message , strlen(client_message));

    }
    if(read_size == 0)
    {
        puts("Client disconnected");
    }
    else if(read_size == -1)
    {
        perror("recv failed");
    }

    return 0;
}

这里是客户端代码:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main(int argc , char *argv[])
{
    int sock;
    struct sockaddr_in server;
    char message[1000] , server_reply[1000];

    //Create socket
    sock = socket(AF_INET , SOCK_STREAM , 0);
    if(sock == -1)
    {
        printf("Could not create socket");
    }
    puts("Socket created");

    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons( 8888 );

    //Connect to remote server
    if(connect(sock, (struct sockaddr *)&server, sizeof(server))<0)
    {
        perror("connect failed");
        return 1;
    }
    puts("Connected\n");

    //Keep communicating with server
    while(1)
    {
        printf("Enter message: ");
        scanf("%s", message);

        //Send some data
        if(send(sock, message, strlen(message), 0)<0)
        {
            puts("Send failed");
            return 1;
        }
        //Recieve a reply from server
        if( recv(sock, server_reply, 1000, 0)<0)
        {
            puts("recv failed");
        }
        puts("Server reply: ");
        puts(server_reply);
        bzero(message, 1000);
        bzero(server_reply, 1000);
    }
    close(sock);
    return 0;

}

【问题讨论】:

    标签: c linux websocket tcp server


    【解决方案1】:

    您在无限循环中接受新客户。因此,即使检测到客户端,代码也会等待其他客户端连接。

    如果您想制作单个客户端服务器,您可以删除accept() 周围的循环。示例here

    如果你想创建一个多客户端服务器,你可以线程接受并存储所有打开的文件描述符。示例here

    【讨论】:

    • 它也可以是一次一个客户端的服务器,方法是将处理客户端的代码放入while循环中。
    • @Barmar 是的!不错的收获。
    • 我删除了 while 循环,它起作用了。谢谢你。但正如@Barmar 所说,我认为它也应该在循环内工作。
    • @tr1umph 您可以验证答案:) 很高兴这个答案对您有所帮助
    【解决方案2】:

    在您的服务器代码中,您永远不会离开这个无限循环:

    while(1)
    {
        //accept connection from an incoming client
        client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t *)&c);
        if(client_sock < 0)
        {
            perror("accept failed");
            return 1;
        }
    }
    

    您应该使用 fork/thread 或使用 select 函数。

    【讨论】:

    • 我刚刚删除了 while 循环,它运行良好。感谢您的回复
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2015-06-13
    • 2021-08-12
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多