TCP客户端进程分割输入输出
创建TCP客户端,创建子进程分割TCP客户端的read功能和write功能,实现分割I/O的目的。加快客户端速率。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUFF_SIZE 1024
//错误输出
void error_handing(char*message)
{fputs(message, stderr);exit(1);
}
/*
**read_data()函数,实现套接字数据的读取功能
**socket:读取数据的套接字句柄
**buff :存储读取的数据
*/
void read_data(int socket, char* buff)
{while(1){int len = read(socket, buff, BUFF_SIZE);if(len == 0)return;buff[len] = 0;printf("Message from server is %s\n", buff);}
}
/*
**write_data()函数,实现套接字数据的写入功能
**socket:写入数据的套接字句柄
**buff :传入需要写入的数据
*/
void write_data(int socket, char* buff)
{while(1){if(strlen(buff)>0)write(socket, buff, strlen(buff));}
}int main()
{//初始化信号和相关变量即buffchar buff[BUFF_SIZE];pid_t pid;uint16_t port = 9999;//1、创建套接字int cli_socket = socket(PF_INET, SOCK_STREAM, 0);//2、绑定连接信息struct sockaddr_in ser_addr;memset(&ser_addr, 0, sizeof(ser_addr));ser_addr.sin_family = AF_INET;ser_addr.sin_addr.s_addr = inet_addr("192.168.1.110");//假设服务器地址为这个ser_addr.sin_port = htons(port);int ser_addrLen = sizeof(ser_addr);//3、连接到服务器if(connect(cli_socket, (struct sockaddr*)&ser_addr, sizeof(ser_addr)) == -1){error_handing("connect() error");}//4、连接成功创建进程,分割输入和输出pid = fork();if(pid == 0)read_data(cli_socket, buff);else{char *buf = "hello, I am write";write_data(cli_socket, buf);}close(cli_socket);return 0;
}