一起talk C栗子吧(第一百五十九回:C语言实例--基于AF_INET域的数据报套接字通信)



各位看官们,大家好,上一回中咱们说的是基于AF_INET域的流套接字通信的例子,这一回咱们说的例子是:基于AF_INET域的数据报套接字通信 。闲话休提,言归正转。让我们一起talk C栗子吧!



看官们,我们在上一回中一起制作了我们的第三道佳肴是:基于AF_INET域的流套接字通信。今天,我将和大家一起制作第四道佳肴:基于AF_INET域的数据报套接字通信。

  • 制作第四道佳肴的菜谱:数据报套接字过程。
  • 制作第四道佳肴的食材:数据报套接字的接口,套接字属性,套接字地址信息。

看官们,以上的内容,我们在前面章回中都详细介绍过,如果大家忘记的话,可以参考前面的内容,重点是第一百四十八回的内容,因为这是我们的菜谱。在食材中最麻烦是套接字地址信息,大家可以参考一百五十五回中的例子。多说无益,我们通过具体的代码来演示 。

服务器端的通信过程及其代码

//1.设置服务器端套接字的属性:域,类型和协议;
    char * host = "localhost";  //using localhost IP address:127.0.0.1
    char * server = "1080";     //using port 1080, it must be more then 1024
    struct addrinfo hints;
    struct addrinfo *result;
    struct sockaddr_in client_address;

    memset(&hints,0,sizeof(struct addrinfo));
    result = NULL;

    hints.ai_flags = AI_NUMERICSERV;
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;

    //get address info ,it has all attribute of socket
    res = getaddrinfo(host,server,&hints,&result);
//2. 创建服务器端套接字
    server_fd = socket(result->ai_family,result->ai_socktype,result->ai_protocol);
//3.把服务器端的套接字和服务器的地址绑定在一起
    res = bind(server_fd,result->ai_addr,result->ai_addrlen);
//4.通过套接字读取数据,这里使用的是recvfrom函数;
    addr_len = 0;
    res = recvfrom(server_fd,buf,BUF_SIZE,0,(struct sockaddr *)&client_address,&addr_len);
    printf("[server] receiving data (%s) from client by socket\n",buf);
//5.释放套接字地址信息。这里没有释放套接字,因为在客户端已经释放并且关闭通信
    if(result->ai_next)
        freeaddrinfo(result);

客户端的通信过程及其代码

//1.设置客户端套接字的属性:域,类型和协议;
    char * host = "localhost";  //using localhost IP address:127.0.0.1
    char * server = "1080";     //using port 1080, it must be more then 1024
    struct addrinfo hints;
    struct addrinfo *result;

    memset(&hints,0,sizeof(struct addrinfo));
    result = NULL;

    hints.ai_flags = AI_NUMERICSERV;
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;

    //get address info ,it has all attribute of socket
    res = getaddrinfo(host,server,&hints,&result);
//2.创建客户端套接字;
    client_fd = socket(result->ai_family,result->ai_socktype,result->ai_protocol);
//3.通过套接字发送数据,这里我们使用的是sendto函数;
    printf("[client] sending data (%s )to server by socket  \n",buf);
    res = sendto(client_fd,buf,sizeof(buf),0,result->ai_addr,result->ai_addrlen);
//4.释放套接字,断开客户端与服务器端的通信;
    if(result->ai_next)
        freeaddrinfo(result);

    res = close(client_fd);

看官们,以上是核心代码,完整的代码放到了我的资源中,大家可以点击这里下载使用。

关于上面的代码,我做一点简要的说明。我们首先获取套接字地址的信息,然后才创建套接字。这和前一回的步骤相同,基中人原因也相同,所以就不作详细介绍了。在这里,我们使用了getaddrinfo函数的结果,这种方法可以提高代码的移植性。这种方法,也使用在了bind函数和sendto函数中。代码中其它的内容和前一章回中的内容十分类似,所以就不作详细介绍了。

我们需要把服务器端的代码和客户端的代码分别进行编译,并且编译成不同的可以执行文件:

$ gcc Ex093_InetDgramSocketClient.c -o client  //编译客户端
$ gcc Ex093_InetDgramSocketServer.c -o server  //编译服务器端

看官们,美味佳肴做好了,我们一起来品尝下,品尝方法就是运行程序,下面是程序的运行结果,请大家参考:

$ ./server &            //在后面运行服务器
[1] 5689
$ ./client              //运行客户端
please input less then 8 chars for using.
dgram
[client] sending data (dgram )to server by socket
[server] receiving data (dgram) from client by socket
[1]+  Done                    ./server    //服务器运行结束

看官们,从上面的运行结果中可以看到,客户端通过套接字发送数据给服务器,而服务器通过套接字接收客户端发来的数据,这样客户端和服务器端可以通过套接字进行通信。另外,我们进行了一次通信,通信的次数可以自己控制,甚至写成无限次也是可以的。每次通信可以看作是一个完整的通信过程,我们在通信过程中发送的数据是字符串”dgram”,大家也可以发送其它的字符串。

各位看官,关于基于AF_INET域的数据报套接字通信的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


时间: 2024-08-08 05:22:46

一起talk C栗子吧(第一百五十九回:C语言实例--基于AF_INET域的数据报套接字通信)的相关文章

一起talk C栗子吧(第一百五十八回:C语言实例--基于AF_INET域的流套接字通信)

各位看官们,大家好,上一回中咱们说的是基于AF_UNIX域的数据报套接字通信的例子,这一回咱们说的例子是:基于AF_INET域的流套接字通信 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中一起制作了我们的第二道佳肴是:基于AF_UNIX域的数据报套接字通信.今天,我将和大家一起制作第三道佳肴:基于AF_INET域的流套接字通信. 制作第三道佳肴的菜谱:流套接字过程. 制作第三道佳肴的食材:流套接字的接口,套接字属性,套接字地址信息. 看官们,以上的内容,我们在前面章

一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)

各位看官们,大家好,上一回中咱们说的是基于AF_UNIX域的流套接字通信的例子,这一回咱们说的例子是:基于AF_UNIX域的数据报套接字通信 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中一起制作了我们的第一道佳肴是:基于AF_UNIX域的流套接字通信.今天,我将和大家一起制作第二道佳肴:基于AF_UNIX域的数据报套接字通信. 制作第二道佳肴的菜谱:数据报套接字过程. 制作第二道佳肴的食材:数据报套接字的接口,套接字属性,套接字地址信息. 看官们,以上的内容,我们

一起talk C栗子吧(第一百五十六回:C语言实例--基于AF_UNIX域的流套接字通信)

各位看官们,大家好,上一回中咱们说的获取socket通信地址的例子,这一回咱们说的例子是:基于AF_UNIX域的流套接字通信 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了套接字的通信过程以及套接字的的细节,总感觉还缺少些什么,一时还真是想不起来.这好比我们有了食谱也有了食材,那么我们就可以做一道美味的佳肴了.啊!有了.一提到美味的佳肴,灵感就来了.我们缺少的是对套接字的综合演练,也就是把前面章回中知识串在一起,然后举一个综合使用套接字知识进行套接字通信的例

一起talk C栗子吧(第一百五十二回:C语言实例--计算机中的大小端)

各位看官们,大家好,上一回中咱们说的是socket通信地址的例子,这一回咱们说的例子是:计算机中的大小端 .闲话休提,言归正转.让我们一起talk C栗子吧! 大小端据说来源于小说<格列佛游记>,书中说:人们在争论打开鸡蛋的方式是从鸡蛋的大端还是小端打开鸡蛋.争论不休,甚至还引起了战争.你说说,不管你从哪一端打开鸡蛋,打开的都是鸡蛋呀,这有什么可以争论的呢?还要通过战争来解决.大家不必关注这个争论,如果真想了解其中的细节,可以看看这部小说.不过在计算机中的大小端就不像小说中争论打开鸡蛋那么简单

一起talk C栗子吧(第一百六十九回:C语言实例--再谈内置宏)

各位看官们,大家好,上一回中咱们说的是C语言中的布尔–bool类型的例子,这一回咱们说的例子是:再谈内置宏 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在第一百二十四回中介绍了C语言中的内置宏,当时介绍了常用的内置宏_LINE_和_FILE_.并且介绍了如何使用它们来输出它们所在位置的行号和所在的文件名.大家都知道,这两个内置宏经常被用来在文件中添加调试信息.因为我们写的程序难免会有错误,所以需要对程序进行调试.在文件中加入内置宏后,我们通过调试可以快速地找到错误发生在哪个

一起talk C栗子吧(第一百五十四回:C语言实例--socket通信地址系统调用二)

各位看官们,大家好,上一回中咱们说的是socket通信地址系统调用的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回介绍的通信地址系统调用有效地解决了数据存储方式的问题,不过,还有一个系统调用也可以解决这种问题,这一回我们将介绍该系统调用:getaddrinfo. 函数原型 该系统调用从其名字上看是用来获取地址的信息,这里的地址主要指套接字通信地址.它获取到的地址信息不需要进行字节序转换,我们可以直接用来进行套接字通信.不过,我们不能只看名字

一起talk C栗子吧(第一百六十二回:C语言实例--套接字知识体系图)

各位看官们,大家好,上一回中咱们说的是套接字通信模型的例子,这一回咱们说的例子是:套接字知识体系图.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们, 我们在前面的章回中介绍了许多关于套接字的内容,有些看官感觉知识比较乱,不断地摇头叹气,而且还在吟诗:剪不断,理还乱,是离愁.不对,是套接字.别有一番滋味在心头.哈哈.这位看官太有才了呀,连古诗也用上了.今天我和大家一起整理下套接字的知识,到时候将会是一番喜悦的滋味在心头. 看官们,我们最开始介绍的是套接字的概念,接着介绍了套接字的属性,

一起talk C栗子吧(第一百二十二回:C语言实例--多线程)

各位看官们,大家好,上一回中咱们说的是线程知识体系图的例子,这一回咱们说的例子是:多线程.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我首先给大家拜个晚年,祝大家在新的一年里身体健康,万事如意. 今天我们介绍一下多线程,我相信大家都听过这个名词,但是具体的含义是什么呢?其实多线程是指两个或者两个以上的线程在一起运行,他们共同完成某个工作. 我们在前面的章回中介绍过使用pthread_create()函数去创建线程.如果想使用多线程,那么只需要多次使用该函数去创建线程就可以.接下来

一起talk C栗子吧(第一百七十九回:C语言实例--字符和字符串输出函数二)

各位看官们,大家好,上一回中咱们说的是字符和字符串输出函数的例子,这一回咱们继续说该例子.闲 话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中介绍了字符和字符串输出函数的用法,満篇都是理论,古语云:纸上得来终觉浅,绝知此事要躬行.这一回中我们要把这些纸上得来理论应用于实践中,让我们一起动手去实践吧. 接下来,我们将通过具体的代码来说明如何使用字符输出函数,以及使用时的注意事项: int main() { char ch = 'a'; char *str = "hello