C 两个客户端套接字程序中的第二个连接很少不被服务器接受

C 两个客户端套接字程序中的第二个连接很少不被服务器接受,c,function,sockets,parameters,C,Function,Sockets,Parameters,我是套接字编程新手,如果这是一个noob问题,我很抱歉。 我有一个C for Linux的程序,它在fork()的帮助下将两个套接字从“server.C”连接到两个“client.C”。它在大多数情况下工作正常,但有时第二个客户机在第一个recv()函数之前卡住。在这些情况下,服务器不接受()连接,我对真正发生的事情以及如何修复它感到困惑。 由于我对套接字编程了解不多,任何解释都可能有用。 以下是服务器和客户端的代码: 服务器.c int main(){ int server_soc

我是套接字编程新手,如果这是一个noob问题,我很抱歉。

我有一个C for Linux的程序,它在fork()的帮助下将两个套接字从“server.C”连接到两个“client.C”。它在大多数情况下工作正常,但有时第二个客户机在第一个recv()函数之前卡住。在这些情况下,服务器不接受()连接,我对真正发生的事情以及如何修复它感到困惑。

由于我对套接字编程了解不多,任何解释都可能有用。


以下是服务器和客户端的代码:

服务器.c

int main(){ 
    int server_socket, p1_socket, p2_socket;
    int pid;

    pid = fork();
    if(pid<0)
        printf("Fork failed.\n");
    else if(pid==0){
        //PLAYER 1
        socket_creation_and_connection(&server_socket, &p1_socket);
        connect_to_player(&p1_socket, 1);
    }
    else{
        //PLAYER 2
        socket_creation_and_connection(&server_socket, &p2_socket);
        connect_to_player(&p2_socket, 2);
    }

    printf("Hello message sent from %d\n", pid); 
    return 0; 
}
void connect_to_player(int *socket, int playerNo){
    char buffer[256]; 

    while(1){
        send(*socket , (int *)&playerNo , sizeof(int) , 0);

        recv(*socket, (int *)&buffer, 1024, 0);
        printf("PlayerNo %d Message received from client %s\n", playerNo, buffer);
   }
}

void socket_creation_and_connection (int *server_socket, int *new_socket){
    struct sockaddr_in address;
    int addrlen = sizeof(address); 

    printf("creating sth\n");
    if ((*server_socket = socket(AF_INET, SOCK_STREAM, 0)) == 0){ 
        perror("Failed to create socket."); 
        exit(EXIT_FAILURE); 
    } 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = INADDR_ANY; 
    address.sin_port = htons( PORT ); 
    if (bind(*server_socket, (struct sockaddr *)&address, sizeof(address))<0){
        perror("Failed to bind."); 
        exit(EXIT_FAILURE); 
    } 
    if (listen(*server_socket, 3)<0){ 
        perror("Failed to listen."); 
        exit(EXIT_FAILURE); 
    } 
    if ((*new_socket = accept(*server_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0){ 
        perror("Failed to accept."); 
        exit(EXIT_FAILURE); 
    }
    printf("finished creating sth\n");
}

我不熟悉fork,但是通过这样做,您是否尝试在同一端口上的两个不同上下文中接受连接?这不应该奏效。您不需要fork-accept,您只需循环except,每次接收到连接时,您可能会在每个套接字上创建一个读取线程?理想情况下,情况并非如此,如果您在GNU/Linux上,您应该使用epoll/select。这将是一个客户端需要通过服务器相互通信的游戏,到目前为止,它使用的是fork()。我还没有尝试过你的想法,因为我不熟悉线程,但是在我找不到如何解决这个问题的情况下,我将尝试实现它们。我将为你编写一个示例代码。
int main(){ 
    int client_socket = 0; 
    char message[256];

    socket_creation_and_connection(&client_socket);

    int intbuf;
    while(1){

        recv(client_socket, (int *)&intbuf, sizeof(int), 0);

        if(intbuf == 1)
            printf("Received message from Player1\n");
        else
            printf("Received message from Player2\n");
        printf("Type a string\n");
        scanf("%s", message);
        send(client_socket, message , strlen(message) , 0 );
        sleep(1);
    }
    return 0; 
}

void socket_creation_and_connection(int *client_socket){
    struct sockaddr_in address; 

    if ((*client_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    { 
        printf("\n Socket creation error \n"); 
        exit(EXIT_FAILURE); 
    } 

    address.sin_family = AF_INET; 
    address.sin_port = htons(PORT); 

    if (connect(*client_socket, (struct sockaddr *)&address, sizeof(address)) < 0) 
    { 
        printf("Connection Failed.\n"); 
        exit(EXIT_FAILURE);
    }
}
#define PORT 8080