socket编程之并发回射服务器2】的更多相关文章

在socket编程之并发回射服务器一文中,服务器采用多进程的方式实现并发,本文采用多线程的方式实现并发. 多线程相关API: // Compile and link with -pthread int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); int pthread_join(pthread_t thread, void **…
承接上文:socket编程之并发回射服务器 为了让服务器进程的终止一经发生,客户端就能检测到,客户端需要能够同时处理两个描述符:套接字和用户输入. 可以使用select达到这一目的: void str_cli(FILE *fp, int sockfd) { int maxfdp1; fd_set rset; char sendline[MAXLINE], recvline[MAXLINE]; FD_ZERO(&rset); for (;;) { FD_SET(fileno(fp), &rs…
使用到的函数: // 子进程返回0,父进程返回子进程ID,出错返回-1 pid_t fork(void); pid_t wait(int *wstatus); // 最常用的option是WNOHANG,它告知内核在没有已终止子进程时不要阻塞 pid_t waitpid(pid_t pid, int *wstatus, int options); 服务器程序: #include <stdio.h> #include <stdlib.h> #include <string.h&…
使用到的函数: // 返回值:读到的字节数,若已到文件尾,返回0:若出错,返回-1 ssize_t read(int fd, void *buf, size_t nbytes); // 返回值:若成功,返回已写的字节数:若出错,返回-1 ssize_t write(int fd, const void *buf, size_t nbytes); int socket(int socket_family, int socket_type, int protocol); int bind(int s…
前言 在上文中,我使用select函数实现了不为客户连接创建子进程的并发回射服务器( 点此进入 ).但其中有个细节确实有点麻烦,那就是还得设置一个client数组用来标记select监听描述符集中被设置为监听位的位. 有没有方法简化这个处理呢? 有!在<UNIX网络编程>第六章最后介绍了一种类似select的函数:poll函数,用它来实现IO复用使代码简化了不少( 起码并发回射服务器的例子是的 ). poll函数介绍 1. 包含头文件:<poll.h> 2. 函数原型:int po…
前言 在上文中,我使用select函数实现了不为客户连接创建子进程的并发回射服务器( 点此进入 ).但其中有个细节确实有点麻烦,那就是还得设置一个client数组用来标记select监听描述符集中被设置为监听位的位.有没有方法简化这个处理呢?有!在<UNIX网络编程>第六章最后介绍了一种类似select的函数 --- poll函数,用它来实现IO复用使代码简化了不少( 起码并发回射服务器的例子是的 ). poll函数介绍 1. 包含头文件:<poll.h> 2. 函数原型:int…
前言 在此前,我已经介绍了一种并发回射服务器实现.它通过调用fork函数为每个客户请求创建一个子进程.同时,我还为此服务器添加了自动消除僵尸子进程的机制.现在请想想,在客户量非常大的情况下,这种为每个客户请求都创建子进程的做法是不是太费资源了?我们可不可以在不为每个客户请求都创建子进程的前提下实现并发回射服务器? 答案自然是肯定的,这也是此文要讲述的方法. 实现思路 服务器建立好监听套接字之后,进入以下循环中: 1. 调用select函数,先使之阻塞于监听套接字描述符(之后阻塞于监听套接字描述符…
前言 在此前,我已经介绍了一种并发回射服务器实现( 点此进入 ).它通过调用fork函数为每个客户请求创建一个子进程.同时,我还为此服务器添加了自动消除僵尸子进程的机制.现在请想想,在客户量非常大的情况下,这种为每个客户请求都创建子进程的做法是不是太费资源了?我们可不可以在不为每个客户请求都创建子进程的前提下实现并发回射服务器?答案自然是肯定的,这也是此文要讲述的方法. 实现思路 服务器建立好监听套接字之后,进入以下循环中: 1. 调用select函数,先使之阻塞于监听套接字描述符( 之后阻塞于…
chapter5  5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in, cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); ser…
问题聚焦: 当客户端阻塞于从标准输入接收数据时,将读取不到别的途径发过来的必要信息,如TCP发过来的FIN标志. 因此,进程需要内核一旦发现进程指定的一个或多个IO条件就绪(即输入已准备好被读取,或者描述符已能承接更多的输出),它就通知进程. 这个机制称为I/O复用,这是由select, poll, epoll函数支持的. 编译环境:     Ubuntu12.04  g++ 需求描述: 单进程,IO复用,实现多个连接同时监听和收发信息 当服务器进程一终止,客户就能马上得到结果(select +…