创建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()
{
//初始化信号和相关变量即buff
char 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;
}