热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一对回射客户/服务器程序及其运行过程分析(上)

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

>前言

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

>客户端



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 ");
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 }


推荐阅读
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • Python多线程详解与示例
    本文介绍了Python中的多线程编程,包括僵尸进程和孤儿进程的概念,并提供了具体的代码示例。同时,详细解释了0号进程和1号进程在系统中的作用。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
author-avatar
小馨小慧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有