多线程udp服务器/客户端

时间:2011-04-06 01:22:28

标签: c udp fork

我刚刚使用udp创建了一个可靠的文件传输,但它只处理一个客户端。所以我想到使用fork()来让服务器处理多个客户端。但是,我真的不知道如何继续。现在,我知道我不需要改变客户端,服务器就是那个做脏工作的服务器。关于如何解决这个问题的任何想法/想法都非常感谢。 PS。这是我开始的方式:

 void sigchldAction(int sig) {
 while (waitpid(-1, 0, WNOHANG) > 0) {
     ;
 }int main(int argc, char *argv[]) {

 return;
} //This is my function that waits for all the processes 

这是我的服务器:

int main(int argc, char *argv[]) {
    struct sockaddr_in serv_addr;
    int port_number, socket_fd;
    port_number = atoi(argv[1]);

    signal(SIGCHLD, sigchldAction);

    if ((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)  exit(EXIT_FAILURE);
    if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR,
 (const void *)&optval, sizeof(int)) < 0) exit(EXIT_FAILURE);

    bzero((void *)&serv_addr, sizeof(struct sockaddr_in));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(port_number);
    if (bind(socket_fd, (struct sockaddr *)&serv_addr,
         sizeof(struct sockaddr_in)) < 0) exit(EXIT_FAILURE);

    pid_t child_pid;
    while (1) {
    child_pid = fork();

    switch (child_pid) {
        case -1:
            perror("Fork() Failed. \n");
            exit(EXIT_FAILURE);
            break;
        case 0:
            process_request(socket_fd);
            exit(EXIT_SUCCESS);
            break;
        case 1:
            close(socket_fd);
            break;

    } 

}
    close(socket_fd);
exit(EXIT_SUCCESS);
}

然后我的process_request函数处理任何传入的数据。

2 个答案:

答案 0 :(得分:4)

如果您使用的是UDP,则表示没有连接;这是一个无连接的协议。

如果要进行分叉,则需要执行ftpd所做的操作,并告诉远程客户端将分叉的子数据包发送到与原始数据包不同的端口上(当然让孩子在该端口上接收) )。

答案 1 :(得分:1)

最好避免使用fork(),并根据源地址区分客户端。

采取的基本方法是获取当前描述应用层连接的所有变量(例如,当前文件,文件中的当前位置,客户端地址),并将这些变量提升为struct。然后,您为每个客户端创建一个此struct的实例。

使用recvfrom()而不是recv()来侦听传入的数据包。这将提供客户端的地址(请注意,此意义上的地址应包括客户端的端口号) - 然后您可以查找每个客户端struct的相应实例。