echo客户端-双进程
- 用于向echo服务端发送字符串,然后接收同样的字符串返回并打印
echo_client.c
#include <stdio.h> //printf、fput
#include <stdlib.h> //atoi
#include <string.h> //memset
#include <unistd.h> //read、close
#include <arpa/inet.h> //sockaddr_in结构、inet_addr
#include <sys/socket.h>
#define BUF_SIZE 100
void write_routine(int sock, char *buf);
void read_routine(int sock, char *buf);
int main(int argc, char *argv[]) {
char buf[BUF_SIZE];
if (argc != 3) {
printf("Usage: %s <IP> <port>\n", argv[0]);
exit(1);
}
int sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1) {
fputs("socket() error", stderr);
exit(1);
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //全部位置0
serv_addr.sin_family = AF_INET; //
serv_addr.sin_addr.s_addr = inet_addr(argv[1]); //取1号参数作为目标IP地址
serv_addr.sin_port = htons(atoi(argv[2])); //取2号参数作为目标端口
if (connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1) {
fputs("connect() error", stderr);
exit(1);
}
pid_t pid = fork(); //多进程实现读写分割
if (pid == 0) {
write_routine(sock, buf);
} else {
read_routine(sock, buf);
}
close(sock);
return 0;
}
void write_routine(int sock, char *buf) {
while(1) {
fgets(buf, BUF_SIZE, stdin);
if (!strcmp(buf, "q\n")) {
shutdown(sock, SHUT_WR);
}
write(sock, buf, strlen(buf));
}
}
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 \n", buf);
}
}
-
编译
gcc echo_client.c -o eclient -
执行
./eclient 127.0.0.1 8100