无法使用我的套接字服务器程序与多个客户端连接

时间:2014-06-27 11:10:37

标签: c sockets socketserver

我的套接字服务器程序如下所述。它适用于单个客户端,但当我尝试同时将其与另一个客户端连接时,我无法连接。但是我已经在我的程序中将MAX_CLIENTS定义为2,但仍然是为什么我无法连接多个客户端?连接多个客户端的正确流程是什么?我可以通过修改此代码来连接多个客户端吗?任何可能的解决办法?

套接字服务器代码:

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

#define ERROR -1
#define MAX_CLIENTS 2
#define MAX_DATA 1024




main (int argc, char **argv){


    struct sockaddr_in server;
    struct sockaddr_in client;
    int sock;
    int new;
    int sockaddr_len = sizeof (struct sockaddr_in);
    int data_len;
    char data [MAX_DATA];


    if ((sock = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {

        perror ("socket: ");
        exit (-1);

    }   
    printf("after socket");
    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(argv[2]));
    server.sin_addr.s_addr = INADDR_ANY;
    bzero (&server.sin_zero, 8);
    printf("after server");


    if ((bind (sock, (struct sockaddr*)&server, sockaddr_len)) == -1)
    {
        perror  ("bind");
        exit (-1);

    }
    printf("after bind");
    if ((listen(sock, MAX_CLIENTS)) == ERROR)
    {
        perror ("listen");
        exit (-1);  

    }
    printf("after listen");

    while(1)

    {
        if ((new = accept(sock, (struct sockaddr*)&client, &sockaddr_len)) == ERROR)
        {


            perror ("accept");
            exit (-1);

        }

            printf("after new");
            printf("New client connected from port no %d and IP %s\n",ntohs(client.sin_port), inet_ntoa(client.sin_addr));
            data_len = 1;
            while (data_len)
                {
                    data_len = recv (new, data, MAX_DATA, 0);
                    if (data_len) 
                    {
                        send (new, data, data_len, 0)   ;
                        data [data_len]='\0';
                        printf("Sent mesg: %s", data);
                    }
                    printf("after datalen");
                }
                printf("Client Disconnected\n");
                close(new);
        }
        printf("after close new");
        close (sock);

    } 

1 个答案:

答案 0 :(得分:5)

你的程序是单线程的,一次只做一件事。当您从客户端接受套接字连接时(在外部while循环中),您开始与该客户端通信(在内部while循环中),并且在第一个客户端断开连接之前您不会回到接受呼叫

使用线程,一个线程等待新连接,另一个线程用于每个客户端,等待来自该客户端的输入,或者使用select调用,这样您就可以从几个不同的源同时等待输入。