? ? ? ? ?創建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;
}