服务端编程示例|学习笔记

简介: 快速学习服务端编程示例

开发者学堂课程【TCP/IP 网络基础:服务端编程示例】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/791


服务端编程示例


内容简介

一、用c语言编写一个TDPUDP服务器和客户端的程序

二、用TCP协议去编写客户端和服务器的程序

三、编写客户端的程序

 

一、用c语言编写一个TDPUDP服务器和客户端的程序

如下图的Demo,这是使用TCP协议客户端和服务器进行的一个通信。

image.png

 

四个Demo,TCP,直接运行一个服务器的程序,打开另外一个客户端,两个窗口的提示就是两个不同的进程,这里进行一下TCP的客户端的程序。

实现客户端发送信息到服务端的功能,服务端接收并显示收到内容,并把收到内容再次发送给客户端。

如果想要退出,exit就可以退出了。

image.png

 

二、用TCP协议去编写客户端和服务器的程序

主要用c语言,建立一个文件夹,重头开始编写,建立一个文件。

在编写之前,需要用到一些文件,系统库的文件或者是socket的文件。

 

 

image.png

第一个定义请求队列的个数,第二个是格式的大小。接下来写main函数,参数是空。首先需要定义socket,直接用socket函数,因为是TCPDemo,所以用流式的socket stringsocket就定义完成。

 

定义socket信息结构体,sockaddr定义。然后进行填充,有三个成员。列一个参数绑定端口号,随意写一个8887

 

调用一个转换函数,写本机的IP地址。先退出来,在系统上填写一个指令,打印所有的IP信息,地址:192.168.86.129

根据实力情况看,然后填充进去,第三步是bind绑定,成功是0,不成功是-1

现在做一个出错的判断,我们可以直接在if里面判断bind内容。如下图。

image.png

image.png

image.png

image.png

image.png

image.png

打印一下信息,这里是bind出错,退出程序,错误码写1,填充一下参数。第一个是socket的文件描述,第二个参数是socket信息结构体,需要取一下地址,

这里参数的类型是socket string,转换一下,转换成sockadd类型。然后对已经初始化完成结构体进行取地址,最后填充大小。

 

下一步就是listen监听,把初始化完成的socket操作换成监听socket,成功返回0,不成功返回-1

同样进行出错的判断,如果listen里面的东西执行后等于负一,同样打印一下出错的信息,属于listen出错,然后退出。

填充一下listen里面的内容,主要有两个参数。一个是socket文件描述符,第二个人监听队列的大小,那么监听函数就写好了。

初始化一下客户端的socket信息结构体,收发数据后,也需要buffer存储,同样也需要一个buffer。先定义一个buffer,数据大小就填已经定义完成的buffer size。接着定义客户端的socket信息结构体,可以直接定义大小,同样用sizeof函数储存bind里面。

定义完成sizeof函数,调用完成后返回socket文件描述符,然后用socket文件描述符去收发数据,并填写参数。第一个参数申请好的server socket。第二个是是客户端的socket信息结构体,进行类型转化。第三个参数是地址。

同样进行出错判断,如果出错就打印一下,然后返回一下出错码

数据的收发。

运用well进行数据的收发,首先在收发里把buffer清空,用memset函数清零,再填大小。然后可以调用函数接收数据,返回值就是接受到一个字母数。

第一个参数就是socket文件描述符,第二个参数是buffer,第三个参数是buffer大小,第四个参数是如图。

当客户端接收exit时可以退出,具体操作如下图。放输入exit按回车,其实加了while函数。

数据显示到终端上,第一个参数是buffer,第二个参数是内容,希望把buffer里的数据显示出来,显示到标准输出。把数据重新发回给客户端,调用send函数,这里数据的收发,在while里。

如果接收到客户端发的exit,退出需要把socket关闭,同时把初始socket关闭,即server socket,最后return,完成TCP客户端的Demo的编写。

编译用gcc,检查错误。反复编译,确保正确。

三、编写客户端的程序

image.png

image.png

可以把之前的文件复制,都是通用的。写程序不可能每次都正确,需要一边写一边调试。再起一个文件,把之前的文件复制过来,不需要重复操作。写一个main函数,第一步定义一个socket,定义一下socket信息结构体,这里填写服务器的信息,对旁边的site进行清空,然后填充里面的成员,首先是协议图,然后是端口号,最后是IP地址。

下一步连接服务器,用connect函数,这里做出错判断,如果为0,就退出并打印错误信息,这里再填充一下参数,填写服务器的socket信息结构体,同样要先转化为socksaddr类型,最后对结构体大小进行测量,这个函数就完成。

下一步数据收发环节,首先定义一下buffer的接收和发送。进行数据收发,写一个while循环,用gets持续循环判断,如果gets里不为空,进行收发。标准输入内容储存,然后获得数据发送,填写socket文件描述符,然后从sendbuf里获取数据,数据大小就是实际内容大小,可以用strien进行测量。接着写判断,如果接收匹配,就退出程序,服务器会把从客户端收到的东西转发回来,用recv接收。里面的参数跟send参数一样,不同的是收到recvbuf里,收到东西打印到fputs里。因为循环,所以recvbufsendbuf的内容要进行清空。那么接收exit退出后,退出了循环,并关闭socket,进行close函数。

现在进行编译是否程序完成,再验证。

先让程序运行,把另外一个服务端程序给执行,接受到后正常退出。这里完成TCP客户端和服务器Demo的编写。

下面进行UDP客户端和服务器程序的编写。

首先看一下小的Demo,先执行服务端的程序,再执行客户端的程序。可以看到服务端收到的是客户端发给它的,写一个while循环完成数据的收发。

udpserver里查看,编写更加简洁,不需要监听等内容,其他文件一样。

然后看一下main函数,首先定义socket文件描述符,用的是socketdgram,初始化后,进行判断,判断内容同上。

然后定义两个socket结构体。serveraddress要对它清空。填充完,用buffer函数对它进行绑定。

然后进行出错判断,出错后退出。然后定义一个recvbuffer,对它进行清零,这里调用recvfrom函数,跟前面不同。这个函数前面几个参数差不多,接收客户端socket信息结构体。

print打印接收到的信息,告诉服务端客户端收到消息,调用sendtorecvfrom的参数差不多。转发完成后,完成数据传输。

 

 

 

 

相关文章
|
11月前
|
SQL 监控 关系型数据库
mysql每次最大插入条数
综上所述,虽然MySQL没有严格限制每次插入操作的最大条数,但实际操作中应综合考虑多种因素,采取适当策略来确保数据插入的高效与稳定。
524 1
|
SQL 存储 调度
从 Volcano 火山模型到 Pipeline 执行模型,阿里云数据库 SelectDB 内核 Apache Doris 执行模型的迭代
一个合适的执行模型对于提高查询效率和系统性能至关重要。本文全面剖析 Apache Doris Pipeline 执行模型的设计与改造历程,并在 2.1 版本对并发执行模式与调度模式进一步优化,解决了执行并发受限、执行及调度开销大等问题。
63458 3
从 Volcano 火山模型到 Pipeline 执行模型,阿里云数据库 SelectDB 内核 Apache Doris 执行模型的迭代
|
9月前
|
存储 人工智能 安全
AI时代,存力 or 算力 哪个更重要
本文探讨了AI技术发展中算力与存力的重要性。算力指计算能力,对处理大数据和实时计算至关重要;存力则是数据存储能力,确保数据安全可靠,支持后续分析。两者相辅相成,共同推动AI技术的快速发展,缺一不可。
|
9月前
|
设计模式 监控 数据库
代理模式(Proxy Pattern)
代理模式(Proxy Pattern)是一种设计模式,通过一个中间对象(代理)来间接访问目标对象,以控制访问权限或添加额外功能。常见的代理类型包括远程代理、虚拟代理、保护代理和智能引用代理。代理模式常用于延迟加载、权限控制、日志记录等场景,能够提高系统的灵活性和安全性。
347 3
|
消息中间件 SQL RocketMQ
RocketMQ-初体验RocketMQ(10)-过滤消息_SQL92表达式筛选消息
RocketMQ-初体验RocketMQ(10)-过滤消息_SQL92表达式筛选消息
293 0
|
10月前
|
数据库 数据安全/隐私保护
共享锁和排他锁在实际应用中的优缺点
【10月更文挑战第16天】共享锁和排他锁是多进程和多线程环境中常用的同步机制,它们各自具有优点和缺点。在实际应用中,需要根据具体的场景和需求选择合适的锁类型。在选择锁时,需要考虑读写比例、数据一致性要求、系统性能、死锁风险等因素,并结合实际情况进行优化和调整。通过合理使用锁,可以提高系统的并发性、数据一致性和性能。
|
自然语言处理
|
人工智能 自然语言处理 安全
飞天技术观丨大模型服务:千锤「百炼」,得其筋骨
大模型应用的表象炫人眼目,但内里却早已发生了巨变。2023年云栖大会上,阿里云CTO周靖人发布了一站式大模型应用开发平台——阿里云百炼,能够帮助企业真正有效地使用好大模型。本文将详解“百炼”的由来以及大模型应用是如何被改造的。
飞天技术观丨大模型服务:千锤「百炼」,得其筋骨
|
存储 小程序 Java
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(九)
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(九)
|
Linux Shell Perl
Linux环境下的字符串处理:基础到高级
在Linux系统中,字符串处理是一个非常常见的任务,无论是在系统管理、文本处理还是脚本编程中。本文将从基础的字符串操作开始,逐步深入,介绍Linux下的字符串处理技术,包括基础的命令行操作、常见的文本处理工具、Shell脚本中的字符串操作等。
494 1