10.4 分割TCP 的IO程序

本文探讨了如何将TCP的IO程序分割,将接收和发送数据的进程分离,以简化程序实现。通过介绍分割IO的实现模型,帮助理解这一技术的应用。
摘要由CSDN通过智能技术生成

1. 分割IO程序:将接收数据,发送数据的进程分开,使程序的实现变得更加简单



2. 分割IO的实现模型


代码:

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#include <sys/socket.h>  
  
#define BUF_SIZE    30
  
void error_handling(char *message);  
void read_routine(int sock,char *buf);
void write_routine(int sock,char *buf);
  
int main(int argc,char *argv[]){  
    int sock;  
    pid_t pid;
    struct sockaddr_in serv_adr;  
    char buf[BUF_SIZE];  
  
    if(argc != 3){  
        printf("Usage : %s <IP> <port>\n",argv[0]);  
        exit(1);  
    }  
  
    sock = socket(PF_INET,SOCK_STREAM,0);  
    if(sock == -1){  
        error_handling("socket() error");  
    }  
      
    memset(&serv_adr,0,sizeof(serv_adr));  
    serv_adr.sin_family = AF_INET;  
    serv_adr.sin_addr.s_addr = inet_addr(argv[1]);  
    serv_adr.sin_port = htons(atoi(argv[2]));  
  
    if(connect(sock,(struct sockaddr *)&serv_adr,sizeof(serv_adr)) == -1){  
        error_handling("connect() error\r\n");  
    }else{  
        printf("Connected....");  
    }  
  
    pid = fork();

    if(pid == 0){
    	write_routine(sock,buf);
    }else{
	read_routine(sock,buf);
    }
    close(sock);  
    return 0;  
}  
  
void error_handling(char *message){  
    fputs(message,stderr);  
    fputs("\n",stderr);  
    exit(1);  
} 

void read_routine(int sock, char *buf){
    while(1){
    	int str_len = read(sock,buf,BUF_SIZE);
	if(str_len == 0){
	    return ;
	}
	
	buf[str_len] = 0;
	printf("Message from server : %s ",buf);
    }
}
 
void write_routine(int sock, char *buf){
    while(1){
	fgets(buf,BUF_SIZE,stdin);
	if(!strcmp(buf,"q\n") || !strcmp(buf,"Q\n")){
	    shutdown(sock,SHUT_WR);
	    return ;
	}
	write(sock,buf,strlen(buf));
    }
}
执行结果:

alex@alex-virtual-machine:/extra/tcpip/10$ ./client 127.0.0.1 9190
Connected....hello
Connected....Message from server : hello
what
 Message from server : what
hi
 Message from server : hi
what
 Message from server : what


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值