第十篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 上 )
前言
本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 );同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程序的技巧。
客户端
1 #include "unp.h" 2 3 void str_cli(FILE *fp, int sockfd); 4 5 int 6 main(int argc, char **argv) 7 { 8 int sockfd; 9 struct sockaddr_in servaddr; 10 11 if (argc != 2) 12 err_quit("usage: tcpcli <IPaddress>"); 13 14 sockfd = Socket(AF_INET, SOCK_STREAM, 0); 15 16 bzero(&servaddr, sizeof(servaddr)); 17 servaddr.sin_family = AF_INET; 18 servaddr.sin_port = htons(SERV_PORT); 19 Inet_pton(AF_INET, argv[1], &servaddr.sin_addr); 20 21 Connect(sockfd, (SA *) &servaddr, sizeof(servaddr)); 22 23 str_cli(stdin, sockfd); 24 25 exit(0); 26 } 27 28 /* 29 * 事务函数 30 */ 31 void 32 str_cli(FILE *fp, int sockfd) 33 { 34 char sendline[MAXLINE], recvline[MAXLINE]; 35 36 // 从标准输入读取字符串( 阻塞于用户 ) 37 while (Fgets(sendline, MAXLINE, fp) != NULL) { 38 39 // 往缓冲区写入字符串 40 Writen(sockfd, sendline, strlen(sendline)); 41 42 // 从缓冲区读取字符串( 阻塞于服务器传回的数据 ) 43 if (Readline(sockfd, recvline, MAXLINE) == 0) 44 err_quit("str_cli: server terminated prematurely"); 45 46 // 读取从服务器回射的消息并在终端打印 47 Fputs(recvline, stdout); 48 } 49 }
服务器端
1 #include "unp.h" 2 3 void str_echo(int sockfd); 4 5 int 6 main(int argc, char **argv) 7 { 8 int listenfd, connfd; 9 pid_t childpid; 10 socklen_t clilen; 11 struct sockaddr_in cliaddr, servaddr; 12 13 listenfd = Socket(AF_INET, SOCK_STREAM, 0); 14 15 bzero(&servaddr, sizeof(servaddr)); 16 servaddr.sin_family = AF_INET; 17 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 18 servaddr.sin_port = htons(SERV_PORT); 19 20 Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); 21 22 Listen(listenfd, LISTENQ); 23 24 for ( ; ; ) { 25 clilen = sizeof(cliaddr); 26 connfd = Accept(listenfd, (SA *) &cliaddr, &clilen); 27 28 if ( (childpid = Fork()) == 0) { /* 子进程处理段 */ 29 Close(listenfd); /* 关闭监听套接字 */ 30 str_echo(connfd); /* 事务处理 */ 31 exit(0); 32 } 33 Close(connfd); /* 父进程关闭连接套接字 */ 34 } 35 } 36 37 /* 38 * 事务处理函数 39 */ 40 void 41 str_echo(int sockfd) 42 { 43 ssize_t n; 44 char buf[MAXLINE]; 45 46 again: 47 while ( (n = read(sockfd, buf, MAXLINE)) > 0) 48 Writen(sockfd, buf, n); 49 50 if (n < 0 && errno == EINTR) 51 goto again; 52 else if (n < 0) 53 err_sys("str_echo: read error"); 54 }
转载于:https://www.cnblogs.com/muchen/p/6357425.html
第十篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 上 )相关推荐
- 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...
- (P9)socket编程四:流协议与粘(nian)包,粘包产生的原因,粘包处理方案,readn,writen 6.回射客户/服务器
文章目录 1.流协议与粘(nian)包 2.粘包产生的原因 4.粘包处理方案 5.readn,writen 6.回射客户/服务器 1.流协议与粘(nian)包 tcp是基于字节流的传输服务(字节流是无 ...
- 打印服务器协议,基于TCP/IP协议的嵌入式网络打印服务器设计
摘要: 随着电子技术和计算机网络技术的发展,嵌入式系统在家庭和工业的各个领域都得到了广泛的应用,各种信息家电,网络设备以及工业控制领域都出现了嵌入式系统的身影,其数量已经远远超过了各种通用计算机.但是 ...
- UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select ...
- TCP echo_server(C++)回射服务器实现以及问题记录
TCP echo_server(C++)回射服务器实现以及问题记录 基本运行方式: 客户端接收用户输入的字符串并发送到服务器端 服务器端将接收的字符串数据传回客户端 服务器端和客户端之间的字符串回射一 ...
- 【UNIX网络编程】| 【03】TCP客户/服务器程序示例
文章目录 1.概述 2.TCP回射服务器程序 3.TCP回射客户程序 3.正常启动 4.正常终止 5.POSIX信号处理 5.1 signal函数 5.2 POSIX信号语义 6.处理SIGCHID信 ...
- 客户和服务器之间响应的序列,网络编程-第五讲-TCP客户-服务器程序例子.pdf-原创力文档...
网络编程 第五讲TCP客户-服务器程序例子 多进程并发服务器基本架构 pid_t pid; int listenfd, connfd; listenfd = Socket( ... ); /* fil ...
- 并发型服务器响应方式,基于Java NIO 开发高性能并发型服务器程序的研究
基于Java NIO 开发高性能并发型服务器程序的研究 第8卷%第5期 软件导刊 2009年5月SoftwareGuide Vol.8No.5May.2009 基于JavaNIO开发高性能并发型服务器 ...
- 一对经典的时间获取客户/服务器程序
前言 本文通过一对经典的时间获取客户/服务器程序,展现了Linux网络编程的大体框架,为以后更深入的学习打下基础. 客户服务器模式网络编程的大体框架 客户端代码 1 #include <stdi ...
最新文章
- Linux如何查看当前目录下文件的个数
- 【面向工业界】推荐算法工程师培养计划
- 如何在64位的windows平台上安装需要c编译的python扩展库
- oracle查询数据库启动时的参数文件,【Oracle】数据库启动阶段参数文件、控制文件的问题处理...
- C++matrix chain multiplication矩阵链乘法算法的实现(附完整源码)
- C语言-目标文件/链接文件
- Typecho - MyTagCloud标签云插件
- 分享31个游戏源代码总有一个是你想要的
- 摘要标红:十四五国家政务信息化规划
- 富士通Fujitsu DPK9500GA Pro 打印机驱动
- ThinkPad SL400 使用经验小记
- qtcpsocket断开_QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)...
- 时钟周期,机器周期(cpu周期),指令周期,存储周期,总线周期
- 2篇SCI二区+3篇一类论文认定A档博士!享110万房补!直接副教授、甚至教授待遇,30万科启
- MySQL1为男_MySQL自定义函数(0显示为女1显示为男
- 微信三方平台调试过程中遇到的问题
- Unity之EditorUtility-ProgressBar进度条-一
- 根证书,解决win7 sp1 64位系统在线安装VS2017 或VS2019的失败
- 【韩顺平老师MyBatis】
- 如何建立用户画像和用户体系?
热门文章
- Linux 切换到 root 用户后没有颜色
- Linux下在tomcat上部署项目
- Windows开机 桌面一片空白 无法操作
- 专题_期权交易必备知识
- 克罗谈投资策略05_涨势买入,跌势卖出
- java 数组不重复_java如何找出数组中的不重复数字
- 软件工程专插本_2021年广东专插本8所学校招生专业(拟),华师停招专插本?...
- 超强计算机病毒代码,木马编程 之超强服务... 附代码 原创.
- 一个人就一个人——读书笔记
- python不定长的参数*,**使用(三分钟读懂)