四、基于多任务的并发服务器( 五 )


四、基于多任务的并发服务器

文章插图

四、基于多任务的并发服务器

文章插图
五、分割TCP的I/O程序 1、分割TCP的I/O程序的优点
向服务器端传输数据,并等待服务器端回复 。无条件等待,直到接收服务器端的回声数据后,才能传输下一批数据 。
使用两个进程,一个用来接收数据,一个用来发送数据 。可以提高频繁交换数据的程序性能 。
1 #include2 #include3 #include 4 #include 5 #include6 #include78 #define BUF_SIZE 30 9 void error_handling(const char *message);10 void read_routine(int sock, char *buf);11 void write_routine(int sock, char *buf);12 13 int main(int argc, char *argv[]) {14int sock;15pid_t pid;16char buf[BUF_SIZE];17struct sockaddr_in serv_adr;18if(argc != 3) {19printf("Usage : %s \n", argv[0]);20exit(1);21}22 23sock = socket(AF_INET, SOCK_STREAM, 0);24memset(&serv_adr, 0, sizeof(serv_adr));25serv_adr.sin_family = AF_INET;26serv_adr.sin_addr.s_addr = inet_addr(argv[1]);27serv_adr.sin_port = htons(atoi(argv[2]));28 29if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1)30error_handling("connect() error");31 32pid = fork();33if(pid == 0)34write_routine(sock, buf);35else36read_routine(sock, buf);37close(sock);38return 0;39 }40 41 void read_routine(int sock, char *buf) {42while (1) {43int str_len = read(sock, buf, BUF_SIZE);44if(str_len == 0) return;45 46buf[str_len] = 0;47printf("Message from server : %s ", buf);48}49 }50 51 void write_routine(int sock, char *buf) {52while (1) {53fgets(buf, BUF_SIZE, stdin);54if(!strcmp(buf, "q\n") || !strcmp(buf, "Q\n")) {55shutdown(sock, SHUT_WR);56return;57}58write(sock, buf, strlen(buf));59}60 }61 62 void error_handling(const char *message) {63fputs(message, stderr);64fputc('\n', stderr);65exit(1);66 }