【问题标题】:Socket Programming, Server w/ Multiple Clients in C套接字编程,C 中带多个客户端的服务器
【发布时间】:2015-05-08 18:52:05
【问题描述】:

我的服务器遇到了一些问题。我正在尝试读取来自多个客户端的输入,但我一次只能读取一个。我认为我的服务器代码没有问题。因此,我假设我的本地客户实际上是这里的错误。如果我想处理具有不同套接字的多个客户端,每个客户端是否完全相同。还是它们在某些方面有所不同?

你们觉得呢?

服务器.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;
}

【问题讨论】:

标签: c sockets client server


【解决方案1】:

什么?

//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);
}

阻塞读取直到没有错误...(使用不正确的 printf)

if (rc == -1) {
  perror("read");
  exit(-1);
}
else if (rc == 0) {
  printf("EOF\n");
  close(cl);
}

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

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

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

【讨论】:

  • 我正在使用 INET 在多个套接字上阅读一些内容,并尝试编辑它们以使用 UNIX。估计不行
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2013-08-31
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多