服务器端代码

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <sys/uio.h>
#define BUFFER_SIZE 1024
static const char*status_line[2] = {"200 OK","500 Internal Server Error"};
int main(void){//1.要集中写的数据const char*file_name = "daytime.c";//2.绑定服务端的监听地址struct sockaddr_in address;bzero(&address,sizeof(address));address.sin_family = AF_INET;//inet_pton(AF_INET,"192.168.131.137",&address.sin_addr);//inet_pton(AF_INET,"localhost",&address.sin_addr);address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(9999);int sock = socket(AF_INET,SOCK_STREAM,0);if(sock == -1){perror("socket");return 1;}int ret = bind(sock,(struct sockaddr*)& address,sizeof(address));if(ret == -1){perror("bind");return 1;}//3.监听ret = listen(sock,5);if(ret == -1){perror("listen");return 1;}//4.接受客户端连接struct sockaddr_in client;socklen_t len = sizeof(client);int connfd = accept(sock,(struct sockaddr*)&client,&len);if(connfd == -1){perror("accept");return 1;}else {//5.输出客户端信息char clientIP[16];inet_ntop(AF_INET,&client.sin_addr.s_addr,clientIP,sizeof(clientIP));unsigned short int port = ntohs(client.sin_port);printf("client ip is %s,port is %d.\n",clientIP,port);char header_buffer[BUFFER_SIZE];memset(header_buffer,'\0',BUFFER_SIZE);char*file_buf;struct stat file_stat;bool valid = true;int len2 = 0;//获取文件的信息if(stat(file_name,&file_stat) == -1){valid = false;}else{//检查是否是目录if(S_ISDIR(file_stat.st_mode)){valid = false;}else if(file_stat.st_mode & S_IROTH){//判断其他用户是否具有可读权限int fd = open(file_name,O_RDONLY);file_buf = new char[file_stat.st_size+1];memset(file_buf,'\0',file_stat.st_size+1);//将文件读入当前的缓冲区当中if(read(fd,file_buf,file_stat.st_size) == -1){valid = false;}}else{valid = false;}}if(valid){//写入版本号和状态码ret = snprintf(header_buffer,BUFFER_SIZE-1,"HTTP/1.1 %s\r\n",status_line[0]);len2 += ret;//写入文件长度ret = snprintf(header_buffer+len2,BUFFER_SIZE-1-len,"Content-Length:%ld\r\n",file_stat.st_size);len2 += ret;//换行符ret = snprintf(header_buffer+len,BUFFER_SIZE-1-len2,"%s","\r\n");//iovec结构体用来描述有几块内存和每块内存有多大,用于集中读和集中写struct iovec iv[2];iv[0].iov_base = header_buffer;iv[0].iov_len = strlen(header_buffer);iv[1].iov_base = file_buf;iv[1].iov_len = file_stat.st_size;ret = writev(connfd,iv,2);//需要加入头文件#incldue<sys/uio.h>}else {//如果是无效的文件,则通知错误信息ret = snprintf(header_buffer,BUFFER_SIZE-1,"%s%s\r\n","HTTP/1.1",status_line[1]);len2 += ret;ret = snprintf(header_buffer+len,BUFFER_SIZE-1-len,"%s","\r\n");send(connfd,header_buffer,strlen(header_buffer),0);}close(connfd);delete[] file_buf;}close(sock);return 0;
}

客户端代码

//tcp 通信客户端
#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>int main(void){//1.创建套接字int fd = socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(0);}//2.连接服务器端struct sockaddr_in serveraddr;serveraddr.sin_family = AF_INET;inet_pton(AF_INET,"192.168.131.138",&serveraddr.sin_addr.s_addr);serveraddr.sin_port = htons(9999);int ret = connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));if(ret == -1){perror("connect");exit(0);}//3.通信// char *data = "hello , i am client.";// write(fd,data,strlen(data));char recvBuf[1024] = {0}; while(read(fd,recvBuf,sizeof(recvBuf)) > 0){printf("%s\n",recvBuf);}// int len2 = read(fd,recvBuf,sizeof(recvBuf));// if (len2 == -1)// {//     perror("read");//     exit(-1);// }// else if(len2 > 0){//     printf("recv client data : %s\n",recvBuf);// }else if(len2 == 0){//     //表示服务端断开连接//     printf("server closed.\n");// }close(fd);return 0;
}

服务端输出

客户端输出
有些符号怪怪的

2022-4-16 服务器集中写相关推荐

  1. on java 8 学习笔记 2022.2.16

    2022.2.16 问题 其实我感觉引用计数的方法不只书中提到的这种问题吧,难道不会有对象被误删的情况吗? 答:不会,因为这种方法就是参考了只要有引用,它就是有效对象的路子,而只要引用大于0,那它就是 ...

  2. 适合人工智能的编程语言有哪些 人工智能学习路线(2022.10.16)

    人工智能ai用什么编程语言_用于AI开发的6种最佳编程语言 人工智能ai用什么编程语言_用于AI开发的6种最佳编程语言_cxq8989的博客-CSDN博客 最适合人工智能开发的六种编程语言 最适合人工 ...

  3. 【SRE笔记 2022.8.16 Linux命令基础01】

    [SRE笔记 2022.8.16] Xsell使用技巧补充 centos 7 root密码重置 方法一 方法二 numtui配置网络 Bash bash命令行图解 命令行提示符 控制变量 PS环境变量 ...

  4. 【不忘初心】 Windows11_22H2_22621.105_X64_可更新[纯净精简版][2.28G](2022.6.16)

    此版可正常更新补丁,关闭按流量计费,WIN11全新的UI界面出炉!可以说这一次Windows 11全新升级,无论是从Logo上还是UI界面设计,都有很大的变化,母版来自UUP WIN11_22621. ...

  5. 在免费的亚马逊服务器上手写个人网站是什么体验(文中有大量福利,别外传)

    目录 本文引言部分: 本文必读部分: 本文福利白嫖部分: 接下来让我们在白嫖的亚马逊云服务Amazon EC2手写网页: 在亚马逊服务器上写网页三步走: 总结Amazon EC2(云服务器)的一些优势 ...

  6. 网吧服务器回写盘用什么型号,网吧服务器回写盘的配置

    网吧服务器回写盘的配置 内容精选 换一换 如果您选择使用SFS Turbo实现文件共享存储,此章节可跳过.在双NFS Server的场景下,需要配置NFS Server之间的同步机制,确保NFS Se ...

  7. _signature、X-Bogus、msToken生成【2022.12.16】全站通用X-Bogus

    本文以教学为基准.本文提供的可操作性不得用于任何商业用途和违法违规场景. 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任. 包含关注,点赞等 没露 ...

  8. 2022以后云服务器的发展趋势

    云服务器在新冠疫情期间被证明其具有强大的力量,提振了全球经济,确保了远程劳动力的连续性,缓解供应链的问题.企业仍然优先考虑业务连续性.成本效率和未来可扩展性.接下来我们看看2022以后云服务器的发展趋 ...

  9. golang日志服务器_golang 写日志到syslog

    应用程序可以通过 UNIX domain sockets, UDP or TCP,向syslog守护进程发送日志.syslog守护进程可以在远端. 这样,就可以不用单独收集应用程序的日志了. gola ...

  10. 如何将写好的网页放到服务器上,写好的网页怎么上传云服务器

    写好的网页怎么上传云服务器 内容精选 换一换 在本地主机和Windows云服务器上分别安装QQ.exe等工具进行数据传输.使用远程桌面连接mstsc方式进行数据传输.该方式不支持断点续传,可能存在传输 ...

最新文章

  1. 小米豪派大红包!向几千名员工发放股权激励,人均39万,应届生都有!小米员工却吵翻天:不公平,作秀!...
  2. 基础:open和fopen的区别
  3. Jexus部署.Net Core项目
  4. mysql010函数使用.单行函数.多行函数
  5. java threadsafe 注解_Java 注解详解
  6. 前端学习(3109):react-hello-开发者工具
  7. 采油工计算机试题库,数字化采油工试题库.doc
  8. Python扩展库安装工具pip的高级用法
  9. ORACLE按用户名重建索引
  10. 使用 Nginx 编译 Sass 和 Scss
  11. 在Eclipse中使用JUnit5进行单元测试
  12. Web 全栈大会:万维网之父的数据主权革命
  13. 2.4-2.8段地址x16+偏移地址=物理地址
  14. [QNX]calib_校准工具使用教程
  15. python 读excel每行替换_Python使用openpyxl读写excel文件
  16. App上架各大应用市场的地址及操作方法
  17. 微信小程序前期申请企业认证、后期提审发布流程
  18. 51最小系统板+STC89C52芯片流水灯
  19. 数据拟合之Excel篇
  20. Facebook广告有哪些有效策略呢?

热门文章

  1. 如何清理虚拟机缓存文件
  2. 思科PacketTrace报错%Inconsistent address and mask解决方法
  3. iOS 10的iMessage新功能你都玩过了吗?炫酷技能大揭秘
  4. 减少过拟合(高方差)的方法
  5. 解决Redis大key问题,看这一篇文章就够了
  6. # 移动端web开发
  7. UI一揽子计划 9 (UITableView 、UITableView 、重用机制)
  8. 基于51单片机的温度探测
  9. 计算机网络复试面试问题总结
  10. java web 在线客服_WebSocket实现客服聊天系统实例详解