服务器端
客户端
代码设置的默认路径为桌面,hello.txt文件位于桌面,选择端口的端口号为8000(命令行第二个参数),127.0.0.1代表回送地址,指本地机,需要先行确认可用(本人通过Apache打开)。
#include <iostream>
#include <unistd.h>
#include <cstddef>
#include <sys/socket.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string>
//保证robust读写
ssize_t rio_writen(int fd, void *userbuf, size_t n)
{
size_t nleft = n;
ssize_t nwrite;
char *bufp = (char*)userbuf;
while(nleft > 0)
{
if((nwrite = write(fd, bufp, nleft))<0)
{
if(errno == EINTR)
nwrite = 0;
else
return -1;
}
nleft -= nwrite;
bufp += nwrite;
}
return n;
}
//带缓存版本
static const int RIO_BUFSIZE = 8192;
struct rio_t
{
int rio_fd; //文件描述符
int rio_cnt; //未读字节数
char *rio_bufptr; //下一个未读字节
char rio_buf[RIO_BUFSIZE];//内部缓冲
};
void rio_readinitb(rio_t *rp, int fd)
{
rp->rio_fd = fd;
rp->rio_cnt = 0;
rp->rio_bufptr = rp->rio_buf;
}
ssize_t rio_read(rio_t *rp, void *userbuf, size_t n)
{
while(rp->rio_cnt <= 0)
{
rp->rio_cnt = read(rp->rio_fd, rp->rio_buf, sizeof(rp->rio_buf));
if(rp->rio_cnt < 0)
{
if(errno != EINTR)
return -1;
}
else if (rp->rio_cnt == 0)
return 0;
else
rp->rio_bufptr = rp->rio_buf;
}
size_t cnt = n > rp->rio_cnt ? rp->rio_cnt : n;
memcpy(userbuf, rp->rio_bufptr, cnt);
rp->rio_bufptr += cnt;
rp->rio_cnt -= cnt;
return cnt;
}
//读文本行,复制到内存位置userbuf,最后在结尾添NULL(0)
ssize_t rio_readlineb(rio_t *rp,