github 代码 地址

  • unp.h
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/select.h>#define MAXLINE 4096
#define SERV_PORT 9877
#define LISTENQ 1024void str_echo(int sockfd);
void err_sys(const char *, ...);// client interface
void str_cli(FILE *fp, int sockfd);
  • echo_client.c
#include    "unp.h"
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>int main(int argc, char **argv) {int sockfd[5];struct sockaddr_in servaddr;int i=0;for (i=0; i<5; i++) {sockfd[i] = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);connect(sockfd[i], (struct sockaddr*)&servaddr, sizeof(servaddr));}str_cli(stdin, sockfd[0]);exit(0);
}
  • str_cli.c
#include "unp.h"// maxline 4096int max(int a, int b) {return a>b? a : b;
}void str_cli(FILE *fp, int sockfd) {int maxfdp1, stdineof;fd_set rset;char sendline[MAXLINE], receline[MAXLINE];int n;stdineof = 0;FD_ZERO(&rset);for (; ;) {// fileno 将标准 I/O 文件指针转换为对应的描述符if (stdineof == 0) {FD_SET(fileno(fp), &rset);}FD_SET(sockfd, &rset);maxfdp1 = max(fileno(fp), sockfd) + 1;select(maxfdp1, &rset, NULL, NULL, NULL);// 如果服务挂掉,客户端可以接受到消息,并退出if (FD_ISSET(sockfd, &rset)) { // socket is readableif ((n = read(sockfd, receline, MAXLINE)) == 0) {if (stdineof == 1) {return;} else {printf("str_cli: server terminated prematurely");return;}}write(fileno(stdout), receline, strlen(receline));bzero(receline, strlen(receline));}if (FD_ISSET(fileno(fp), &rset)) {if ( (n = read(fileno(stdin), sendline, MAXLINE) == 0) ){stdineof = 1;shutdown(sockfd, SHUT_WR);FD_CLR(fileno(fp), &rset);continue;}write(sockfd, sendline, strlen(sendline));bzero(sendline, strlen(sendline));}}
}
  • echo_service.c
#include    "unp.h"int main(int argc, char **argv) {int i, maxi, maxfd, listenfd, connfd, sockfd;int nready, client[FD_SETSIZE];size_t n;fd_set rset, allset;char buf[MAXLINE];socklen_t clilen;struct sockaddr_in cliaddr, servaddr;listenfd = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));listen(listenfd, LISTENQ);maxfd = listenfd;maxi = -1;   // client 数组当前使用项的最大下标for(i=0; i<FD_SETSIZE; i++) {client[i] = -1;}FD_ZERO(&allset);FD_SET(listenfd, &allset);for(;;) {rset = allset;nready = select(maxfd+1, &rset, NULL, NULL, NULL);if(FD_ISSET(listenfd, &rset)) {clilen = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);for (i=0; i<FD_SETSIZE; i++) {if (client[i] < 0 ) {client[i] = connfd;break;}}if (i == FD_SETSIZE) {exit(0);}FD_SET(connfd, &allset);if (connfd > maxfd) {maxfd = connfd;}if (i > maxi) {maxi = i;}if (--nready <= 0) {continue;}}for (i = 0; i <= maxi; i++) {if ((sockfd = client[i]) < 0) {continue;}if (FD_ISSET(sockfd, &rset)) {if ( ( n = read(sockfd, buf, MAXLINE)) == 0) {close(sockfd);FD_CLR(sockfd, &allset);client[i] = -1;} else {write(sockfd, buf, n);}if (--nready <= 0) {break;}}}}
}
  • CMakeList.txt
project(echo_srv)
set(CMAKE_CXX_STANDARD 11)
add_executable(echo_srv echo_service.c error.c)# client
add_executable(echo_cli echo_client.c str_cli.c)

socket 编程 基于 select 实现的回射客户端/服务程序相关推荐

  1. socket编程的select模型

    在掌握了socket相关的一些函数后,套接字编程还是比较简单的,日常工作中碰到很多的问题就是客户端/服务器模型中,如何让服务端在同一时间高效的处理多个客户端的连接,我们的处理办法可能会是在服务端不停的 ...

  2. SOCKET编程中,select()函数的作用

    SOCKET编程中,select()函数的作用Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accep ...

  3. Netty的Socket编程详解-搭建服务端与客户端并进行数据传输

    场景 Netty在IDEA中搭建HelloWorld服务端并对Netty执行流程与重要组件进行介绍: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  4. 第十篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 上 )

    前言 本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 ):同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程 ...

  5. UNIX网络编程笔记(4):简单的回射程序

    上一讲中我们通过调用fork函数实现了一个简单的并发时间获取服务器.这是一个简单的并发服务器框架,然而这里使用这个框架实现一个简单的回射服务器会出现一个问题,这个问题就是僵尸子进程. 1.回射程序 下 ...

  6. 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )

    执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...

  7. MFC:Socket编程—TCP服务端和多个客户端通信

    前言 MFC是微软基础类库,于 C++ 对于 C语言来说,MFC对于window API ,MFC 就相当于C++,window API 相当于C.MFC 封装了 window API 使用起来更加的 ...

  8. socket 编程:回射客户/服务程序

    参考 <Unix 网络编程> github 地址 unp.h #include <stdio.h> #include <unistd.h> #include < ...

  9. Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...

    此人博客挺好的,推荐一个! 一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实 ...

最新文章

  1. 投稿数翻倍,接收率不到三成!史上最难的ECCV你中了吗?
  2. 网站模糊测试爆破工具Wfuzz
  3. RPC与其实现方式概念笔记
  4. Invalid config event received: {version=0, server
  5. 经典面试题(三):ASP.NET部分----ASP.NET 页面之间传递值的几种方式
  6. jdbc存储过程mysql_使用JDBC操作存储过程
  7. javascript;json数据,js转换日期方法。
  8. matlab回归系数 t检验6,matlab做回归分析时,能做t检验吗?
  9. strut2_struts.xml文件配置知识点汇集
  10. 运维工程师mysql面试题及答案_运维工程师面试题及答案解析
  11. sprint 周期总结
  12. 软件工程复习 第三章 软件立项
  13. UVALive3713-Astronauts 2-SAT
  14. [Android] 微信apk.1安装器,200k可隐藏 解决微信传apk自动改名apk.1f无法安装问题
  15. mysql 查询优化实验报告_数据库优化查询实验报告.docx
  16. 学编程好比学游泳——欠炼
  17. matlab plot fplot函数
  18. Intellij idea 第一天
  19. Ubuntu下编译qt程序libQtWebEngineCore报错
  20. 20191225-How to read a paper 如何读英文文献

热门文章

  1. ios系统python编译器_MacBook如何安装Python编译器-百度经验
  2. 普通 项目打包包含第三方jar包
  3. oracle pl/sql编程详解,OraclePL/SQL高级编程详解
  4. flink写入 mysql_flink写数据到mysql(java)
  5. 去掉左边0_SLAM从0到1——11. 视觉里程计VO内容框架
  6. oracle数据库存大文本,Oracle大文本在ASP中存取问题的解决
  7. 几道web前端练习题目
  8. css 浮动和清除浮动
  9. 6.11python 作业
  10. Selenium WebDriver + python 自动化测试框架