服务端编程示例|学习笔记-阿里云开发者社区

开发者社区> 【开发者学堂】官方技术圈> 正文
登录阅读全文

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

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

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

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


服务端编程示例


内容简介

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

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

三、编写客户端的程序

 

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

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

image.png

 

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

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

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

image.png

 

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

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

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

 

 

image.png

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

 

定义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里。因为循环,所以recvbuf和sendbuf的内容要进行清空。那么接收exit退出后,退出了循环,并关闭socket,进行close函数。

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

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

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

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

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

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

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

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

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

 

 

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

阿里云开发者学堂,是开发者学习成长的一站式学习平台。平台源源不断的生产优质体系化课程、优质内容如电子书、直播、体验场景、训练营等,为开发者构建完善的学习成长体系,为开发者赋能。目前,开发者学堂包含数据库、大数据、云原生、AI、IoT等各大热门领域精品课,全部免费对开发者开放。

官方博客
最新文章
相关文章
官网链接