前言

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

客户端

 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的一对回射客户/服务器程序及其运行过程分析( 上 )相关推荐

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

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

  2. (P9)socket编程四:流协议与粘(nian)包,粘包产生的原因,粘包处理方案,readn,writen 6.回射客户/服务器

    文章目录 1.流协议与粘(nian)包 2.粘包产生的原因 4.粘包处理方案 5.readn,writen 6.回射客户/服务器 1.流协议与粘(nian)包 tcp是基于字节流的传输服务(字节流是无 ...

  3. 打印服务器协议,基于TCP/IP协议的嵌入式网络打印服务器设计

    摘要: 随着电子技术和计算机网络技术的发展,嵌入式系统在家庭和工业的各个领域都得到了广泛的应用,各种信息家电,网络设备以及工业控制领域都出现了嵌入式系统的身影,其数量已经远远超过了各种通用计算机.但是 ...

  4. UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select ...

  5. TCP echo_server(C++)回射服务器实现以及问题记录

    TCP echo_server(C++)回射服务器实现以及问题记录 基本运行方式: 客户端接收用户输入的字符串并发送到服务器端 服务器端将接收的字符串数据传回客户端 服务器端和客户端之间的字符串回射一 ...

  6. 【UNIX网络编程】| 【03】TCP客户/服务器程序示例

    文章目录 1.概述 2.TCP回射服务器程序 3.TCP回射客户程序 3.正常启动 4.正常终止 5.POSIX信号处理 5.1 signal函数 5.2 POSIX信号语义 6.处理SIGCHID信 ...

  7. 客户和服务器之间响应的序列,网络编程-第五讲-TCP客户-服务器程序例子.pdf-原创力文档...

    网络编程 第五讲TCP客户-服务器程序例子 多进程并发服务器基本架构 pid_t pid; int listenfd, connfd; listenfd = Socket( ... ); /* fil ...

  8. 并发型服务器响应方式,基于Java NIO 开发高性能并发型服务器程序的研究

    基于Java NIO 开发高性能并发型服务器程序的研究 第8卷%第5期 软件导刊 2009年5月SoftwareGuide Vol.8No.5May.2009 基于JavaNIO开发高性能并发型服务器 ...

  9. 一对经典的时间获取客户/服务器程序

    前言 本文通过一对经典的时间获取客户/服务器程序,展现了Linux网络编程的大体框架,为以后更深入的学习打下基础. 客户服务器模式网络编程的大体框架 客户端代码 1 #include <stdi ...

最新文章

  1. Linux如何查看当前目录下文件的个数
  2. 【面向工业界】推荐算法工程师培养计划
  3. 如何在64位的windows平台上安装需要c编译的python扩展库
  4. oracle查询数据库启动时的参数文件,【Oracle】数据库启动阶段参数文件、控制文件的问题处理...
  5. C++matrix chain multiplication矩阵链乘法算法的实现(附完整源码)
  6. C语言-目标文件/链接文件
  7. Typecho - MyTagCloud标签云插件
  8. 分享31个游戏源代码总有一个是你想要的
  9. 摘要标红:十四五国家政务信息化规划
  10. 富士通Fujitsu DPK9500GA Pro 打印机驱动
  11. ThinkPad SL400 使用经验小记
  12. qtcpsocket断开_QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)...
  13. 时钟周期,机器周期(cpu周期),指令周期,存储周期,总线周期
  14. 2篇SCI二区+3篇一类论文认定A档博士!享110万房补!直接副教授、甚至教授待遇,30万科启
  15. MySQL1为男_MySQL自定义函数(0显示为女1显示为男
  16. 微信三方平台调试过程中遇到的问题
  17. Unity之EditorUtility-ProgressBar进度条-一
  18. 根证书,解决win7 sp1 64位系统在线安装VS2017 或VS2019的失败
  19. 【韩顺平老师MyBatis】
  20. 如何建立用户画像和用户体系?

热门文章

  1. Linux 切换到 root 用户后没有颜色
  2. Linux下在tomcat上部署项目
  3. Windows开机 桌面一片空白 无法操作
  4. 专题_期权交易必备知识
  5. 克罗谈投资策略05_涨势买入,跌势卖出
  6. java 数组不重复_java如何找出数组中的不重复数字
  7. 软件工程专插本_2021年广东专插本8所学校招生专业(拟),华师停招专插本?...
  8. 超强计算机病毒代码,木马编程 之超强服务... 附代码 原创.
  9. 一个人就一个人——读书笔记
  10. python不定长的参数*,**使用(三分钟读懂)