服务器端代码如果采用fork写时复制(Copy on Write)技术,代码还可以更简洁一点
服务端代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <arpa/inet.h>
#define BUFSIZE 4096
#define CHILD_PORT_START 16500
const char* Inet_ntop(void* ptr) {
static char str[INET_ADDRSTRLEN];
return inet_ntop(AF_INET,ptr,str,INET_ADDRSTRLEN);
}
void server_echo(int sockfd) {
int fullfd[2];
if (socketpair(AF_UNIX,SOCK_DGRAM,0,fullfd) < 0) {
printf("sockpair error: %s\n",strerror(errno));
exit(1);
}
char recv[BUFSIZE];
struct sockaddr_in clientaddr;
socklen_t len = sizeof(struct sockaddr_in);
ssize_t n;
struct iovec iov[2];
int pid;
for (; ;) {
if ((n = recvfrom(sockfd,recv,BUFSIZE,0,(struct sockaddr*)&clientaddr,&len)) < 0) {
printf("receive from client error: %s\n",strerror(errno));
break;
}
iov[0].iov_base = &clientaddr;
iov[0].iov_len = len;
iov[1].iov_base = recv;
iov[1].iov_len = n;
if (writev(fullfd[0],iov,2) != n + len) {
printf(