TCP回显服务器不接受客户端

时间:2020-05-11 13:16:17

标签: c linux websocket tcp server

我试图在C中制作一个回显客户端服务器。问题是,当我启动服务器并运行客户端代码时,在客户端外壳中它会显示“已连接”,但是在服务器外壳中它仍会显示“正在等待连接” ”。 (服务器不会说“接受失败”。它会永远说“等待连接”)。我认为服务器不接受客户端,因此,如果我从客户端外壳写入任何内容,它都不会返回。

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

这是服务器代码:


    data: {
      activeIndex: null
    },
    methods: {
       toggleActiveIndex: function(index){
         this.activeIndex = index
       }
    }

这是客户端代码:

#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;
}

2 个答案:

答案 0 :(得分:1)

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

如果要制作一台客户端服务器,只需删除accept()周围的循环即可。示例here

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

答案 1 :(得分:1)

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

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函数。