当前位置:首页>编程日记>正文

网络编程学习笔记(批量输入)

服务器端:
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>#define SIN_PORT 9999
#define BUFLEN 256void str_echo(int fd);void sig_child(int signo)
{pid_t pid;int stat;while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) {printf("pid %d terminated
", pid);}}int main(int argc, char **argv)
{int listenfd, connfd;pid_t child;struct sockaddr_in servaddr;char buf[BUFLEN];time_t ticks;listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd < 0) {printf("socket error :%s
", strerror(errno));        return -1;}servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SIN_PORT);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);signal(SIGCHLD, sig_child);if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {printf("bind error:%s
", strerror(errno));close(listenfd);return -1;}if (listen(listenfd, 3) < 0) {printf("listen error:%s
", strerror(errno));close(listenfd);return -1;}struct sockaddr_in clientaddr;int len;for (;;) {len = sizeof(clientaddr);connfd = accept(listenfd, (struct sockaddr*)&clientaddr, &len);if (connfd < 0) {printf("accept error:%s
", strerror(errno));close(listenfd);return -1;}if ((child = fork()) == 0) {close(listenfd);str_echo(connfd);return 0;}close(connfd);}return 0;
}size_t readn(int fd, void *ptr, size_t n)
{char *p = ptr;size_t nleft = n;size_t nread;while (nleft > 0) {if ((nread = read(fd, p, nleft)) < 0) {if (errno == EINTR) nread = 0;else return -1;} else if (nread == 0) break;nleft -= nread;p += nread;}return n - nleft;
}size_t readline(int fd, void *ptr, size_t maxsize)
{char *p = ptr;size_t rc, n;char c;for (n = 1; n < maxsize; n++) {
again:if ((rc = read(fd, &c, 1)) == 1) {*p++ = c;if (c == '
') break;} else if (rc == 0) {if (n == 1) return 0;else break;} else {if (errno == EINTR) goto again;return -1;}}*p = 0;return n;
}size_t writen(int fd, void *ptr, size_t n)
{char *p = ptr;size_t nleft = n,  nwriten;while (nleft > 0) {if ((nwriten = write(fd, p, nleft)) <= 0) {if (errno == EINTR) nwriten = 0;else return -1;}p += nwriten;nleft -= nwriten;}return n;
}void str_echo(int fd)
{char recvline[BUFLEN];int n;for (;;) {if ((n = readline(fd, recvline, BUFLEN)) == 0) return;printf("received buf=%s", recvline);writen(fd, recvline, n);}
}

客户端:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>#define SIN_PORT 9999
#define BUF_LEN 256
#define max(a, b) ((a) > (b) ? (a) : (b))size_t readline(int fd, void *ptr, int maxsize)
{char *p = ptr;char c;int rc;int n;for (n = 1; n < maxsize; n++) {again:if ((rc = read(fd, &c, 1)) == 1) {*p++ = c;if (c == '
') break; } else if (rc == 0) {if (n == 1) return 0;else break;}else {if (errno == EINTR) goto again;else return -1;}}*p = 0;return n;
}size_t readn(int fd, void *ptr, size_t n)
{char *p = ptr;int nleft = n;int nread;while (nleft > 0) {if ((nread = read(fd, p, nleft)) < 0) {if (errno == EINTR) nread = 0;else return -1;} else if (nread == 0) break;nleft -= nread;p += nread;}return n - nleft;
}size_t writen(int fd, void *ptr, size_t n)
{size_t nwriten;size_t nleft = n;char *p = ptr;while (nleft > 0) {if ((nwriten = write(fd, p, nleft)) <= 0) {if (errno == EINTR) nwriten = 0;else return -1;}nleft -= nwriten;p += nwriten;}return n;
}void str_cli(FILE *file, int fd)
{char recvline[BUF_LEN], sendline[BUF_LEN];int maxfdp1;fd_set fdset;int ret;int stdineof = 0;FD_ZERO(&fdset);for(;;) {if (stdineof == 0)FD_SET(fileno(file), &fdset);FD_SET(fd, &fdset);maxfdp1 = max(fileno(file), fd) + 1;ret = select(maxfdp1, &fdset, NULL, NULL, NULL);   if (ret <= 0) {continue;}//printf("ret=%d
", ret);if (FD_ISSET(fd, &fdset)) {if (readline(fd, recvline, BUF_LEN) == 0) {if (stdineof == 1)return;else {printf("readline error:%s
", strerror(errno));return;}}fputs(recvline, stdout);} if (FD_ISSET(fileno(file), &fdset)) {memset(sendline, 0x00, sizeof(sendline));if (fgets(sendline, BUF_LEN, file) == NULL) {//printf("fgets error:%s
", strerror(errno));stdineof = 1;shutdown(fd, SHUT_WR);FD_CLR(fileno(file), &fdset);continue;}//printf("len=%d
", strlen(sendline));writen(fd, sendline, strlen(sendline));}   }
}int main(int argc, char** argv)
{struct sockaddr_in serveraddr;int sockfd;#ifndef ONLINE_JUDGEfreopen("6.4Client.c", "r", stdin);
#endifsockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {printf("socket error:%s
", strerror(errno));return -1;}   serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(SIN_PORT);if (inet_pton(AF_INET, argv[1], &serveraddr.sin_addr) != 1) {printf("inet_pton error:%s
", strerror(errno));close(sockfd);return -1;}if (connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) {printf("connect error:%s
", strerror(errno));close(sockfd);return -1;}str_cli(stdin, sockfd);exit(0);}

客户端读到EOF时,退出关闭套接字,导致输出的与输入的不一致(服务端显示的多于客户端显示的),在客户端读到EOF时,只是关闭客户端的写


http://www.coolblog.cn/news/4dc767d31e2c25c6.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • 2019-9
  • jquery 使用小技巧
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • linux批量创建用户和密码
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • js常用阻止冒泡事件
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • 【设计模式】 模式PK:策略模式VS状态模式
  • JS实现-页面数据无限加载
  • CSS小技巧——CSS滚动条美化
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里巴巴分布式服务框架 Dubbo
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 两张超级大表join优化
  • Arm芯片的新革命在缓缓上演
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • 《看透springmvc源码分析与实践》读书笔记一
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • 通过Spark进行ALS离线和Stream实时推荐
  • 行为模式之Template Method模式