目录
代码
运行结果
代码
chat.h
#ifndef CHAT_H__ #define CHAT_H__ #define PORT "52189" #define IPSIZE 64 #define MSGSIZE 1024 #define PROGRESSMAX 8 #endif
server.c
#include#include #include #include #include #include #include #include #include #include "chat.h" static void func_recv(int sfd){ int len, ret, pos; char msgbuf[MSGSIZE]; while(1){ len = recv(sfd, msgbuf, MSGSIZE, 0); if(len <= 0){ break; } write(1, "nrecvmsg:", 9); while(len){ pos = 0; ret = write(1, msgbuf+pos, len); pos += ret; len -= ret; } } return ; } static void func_send(int sfd){ int len; char msgbuf[MSGSIZE]; while(1){ len = read(0, msgbuf, MSGSIZE); send(sfd, msgbuf, len, 0); write(1, "send OK!n", 9); } return ; } int main(){ int local_sd, remote_sd; struct sockaddr_in local_addr, remote_addr; socklen_t local_addr_len, remote_addr_len; pid_t pid; if((local_sd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ perror("socket()"); exit(1); } local_addr.sin_family = AF_INET; local_addr.sin_port = htons(atoi(PORT)); inet_pton(AF_INET, "0.0.0.0", &local_addr.sin_addr); local_addr_len = sizeof(local_addr); if(bind(local_sd, (void*)&local_addr, local_addr_len) < 0){ perror("bind()"); exit(1); } if(listen(local_sd, 8) < 0){ perror("listen()"); exit(1); } remote_addr_len = sizeof(remote_addr); if((remote_sd = accept(local_sd, (void*)&remote_addr, &remote_addr_len)) < 0){ perror("accept()"); exit(1); } pid = fork(); if(pid < 0){ perror("fork()"); exit(1); }else if(pid == 0){ //recv func_recv(remote_sd); exit(0); }else{ //send func_send(remote_sd); } waitpid(pid, NULL, 0); close(local_sd); exit(0); }
client.c
#include#include #include #include #include #include #include #include #include #include "chat.h" static void func_recv(int sfd){ int len, ret, pos; char msgbuf[MSGSIZE]; while(1){ len = recv(sfd, msgbuf, MSGSIZE, 0); if(len <= 0){ break; } write(1, "nrecvmsg:", 9); while(len){ pos = 0; ret = write(1, msgbuf+pos, len); pos += ret; len -= ret; } } return ; } static void func_send(int sfd){ int len; char msgbuf[MSGSIZE]; while(1){ len = read(0, msgbuf, MSGSIZE); send(sfd, msgbuf, len, 0); write(1, "send OK!n", 9); } return ; } int main(){ int remote_sd; struct sockaddr_in remote_addr; socklen_t remote_addr_len; pid_t pid; remote_sd = socket(AF_INET, SOCK_STREAM, 0); if(remote_sd < 0){ perror("socket()"); exit(1); } remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(atoi(PORT)); inet_pton(AF_INET, "127.0.0.1", &remote_addr.sin_addr); remote_addr_len = sizeof(remote_addr); if(connect(remote_sd, (void*)&remote_addr, remote_addr_len) < 0){ perror("connect()"); exit(1); } pid = fork(); if(pid < 0){ perror("fork()"); exit(1); }else if(pid == 0){ //recv func_recv(remote_sd); exit(0); }else{ //send func_send(remote_sd); } waitpid(pid, NULL, 0); close(remote_sd); exit(0); }
运行结果
测试环境:Ubuntu 21.10, gcc version 11.2.0



