套接字编程,C中有多个客户端的服务器

时间:2015-05-08 18:52:06

标签: c sockets client server

我的服务器遇到了一些问题。我正在尝试从多个客户端读取输入,但我一次只能做一个。我认为我的服务器代码没有问题。所以我假设我的本地客户是真正有问题的客户。如果我想处理具有不同套接字的多个客户端,那么每个客户端是否与另一个客户端完全相同。或者它们在某些方面有所不同?

你们有什么想法?

Server.c

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <stdlib.h>

//char *socket_path = "./socket";
char *socket_path = "\0hidden";

int main(int argc, char *argv[]) {
    struct sockaddr_un addr;
    //max client sockets
    int max_sd, sd, i, client_socket[3], activity;
    char buf[100];
    int fd,cl,rc;
    fd_set readfds;

    if (argc > 3) socket_path=argv[3];

    //establish socket
    if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket error");
        exit(-1);
    }

    //establish socket name
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);

    unlink(socket_path);

    //bind socket
    if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
        perror("bind error");
        exit(-1);
    }

    //listen to the socket
    if (listen(fd, 5) == -1) {
        perror("listen error");
        exit(-1);
    }

    while (1) {

        //clear the scoket set
        FD_ZERO(&readfds);

        //add fd socket to set
        FD_SET(fd, &readfds);
        max_sd = fd;

        //add child sockets to the set
        for(i = 0; i < 3; i++) {
            sd = client_socket[i];

            if(sd > 0) {
                FD_SET( sd, &readfds);
            }

            if(sd > max_sd) {
                max_sd = sd;
            }
        }

        //wait for an activity from a socket
        activity = select(max_sd + 1, &readfds,NULL, NULL,NULL);

        if((activity < 0) && (errno!=EINTR)) {
            printf("select");
        }

        if(FD_ISSET(fd, &readfds)) {

            if ( (cl = accept(fd, NULL, NULL)) == -1) {
                perror("accept error");
                continue;
            }

            while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
                printf("read %u bytes: %.*s\n", rc, rc, buf);
            }
            if (rc == -1) {
                perror("read");
                exit(-1);
            }
            else if (rc == 0) {
                printf("EOF\n");
                close(cl);
            }   
        }
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

什么?

DECLARE
treat_rec Hospital.TrtRecTyp;
lv_cnt_num NUMBER(2) := 0;
lv_row_cnt_num NUMBER(2);

BEGIN    

   i Hospital.BuildPatTbl(treat_rec, lv_cnt_num);     

    FOR i IN 1..10 LOOP

           DBMS_OUTPUT.PUT_LINE('Pat_Nbr = ' || treat_rec.Pat_Nbr);
           DBMS_OUTPUT.PUT_LINE('Trt_Procedure = ' || treat_rec.Trt_Procedure);
           DBMS_OUTPUT.PUT_LINE('Phys_ID = ' || treat_rec.Phys_ID);
           DBMS_OUTPUT.PUT_LINE('Phys_Name = ' || treat_rec.Phys_Name);
           DBMS_OUTPUT.PUT_LINE('Phys_Specialty = ' || treat_rec.Phys_Specialty);   

    END LOOP;

    DBMS_OUTPUT.PUT_LINE('The number of rows returned in the table is: ' || lv_cnt_num);

END;

接受连接......

//wait for an activity from a socket
activity = select(max_sd + 1, &readfds,NULL, NULL,NULL);

if((activity < 0) && (errno!=EINTR)) {
    printf("select");
}
if(FD_ISSET(fd, &readfds)) {

if ( (cl = accept(fd, NULL, NULL)) == -1) {

阻止读取,直到没有错误...(printf不正确)

  perror("accept error");
  continue;
}

while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
  printf("read %u bytes: %.*s\n", rc, rc, buf);
}

不正确,但假设没有真正的错误意味着阅读直到另一方关闭他们的一方。

考虑到这一点,这应该如何同时支持几个客户?

阅读本文:http://www.kegel.com/c10k.html

答案 1 :(得分:0)

我不知道套接字在C中是如何工作的,但我一直在研究一些Java程序,在java中解决问题的方法是在服务器上为每个客户端提供一个单独的线程。每次客户端连接到服务器时,您都会启动一个将为该客户端提供服务的线程。叉子可能会有所帮助。