linux下的UDP套接字编程

简介:

一.相关过程以及知识请详见我的另一篇博客《winsock套接字编程》,这里不再累述。





二.相关代码:

server.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  /****************************************                                                                                                 
   2     > File Name:server.c
   3     > Author:xiaoxiaohui
   4     > mail:1924224891@qq.com
   5     > Created Time:2016年05月21日 星期六 15时05分23秒
   6 ****************************************/
  
   8 #include<stdio.h>
   9 #include<stdlib.h>
  10 #include<sys/types.h>
  11 #include<sys/socket.h>
  12 #include<unistd.h>
  13 #include<arpa/inet.h>
  14 #include<netinet/in.h>
  15 #include<string.h>
  16 
  17  const  int  PORT = 9090;
  18  const  int  LEN = 1024;
  19  int  serverSock;
  20  struct  sockaddr_in local;
  21  struct  sockaddr_in client;
  22 
  23 
  24  int  main()
  25 {
  26     serverSock = socket(AF_INET, SOCK_DGRAM, 0);
  27 
  28     local.sin_family = AF_INET;
  29      //local.sin_addr.s_addr = htonl(INADDR_ANY);
  30     local.sin_port = htons(PORT);
  31     local.sin_addr.s_addr = inet_addr( "127.0.0.1" );
  32     bind(serverSock, ( struct  sockaddr*)&local,  sizeof (local));
  33 
  34      char  buf[LEN];
  35      while (1)
  36     {
  37          int  ret = 0;
  38         socklen_t  len =  sizeof (client);
  39          memset (buf,  '\0' , LEN);
  40         ret = recvfrom(serverSock, buf, LEN - 1, 0, ( struct  sockaddr*)&client, &len);
  41 
  42          printf ( "ret is %d" , ret);
  43          if (ret == 0)
  44         {
  45              printf ( "client is closed!\n" );
  46              exit (2);
  47         }
  48          else  if (ret < 0)
  49         {
  50              perror ( "recvfrom" );
  51              continue ;
  52         }
  53          else
  54         {
  55             buf[ret] =  '\0' ;
  56              printf ( "client[ip:%s][port:%d]# %s\n" , inet_ntoa(client.sin_addr), \
  57                     ntohs(client.sin_port), buf);
  58              fflush (stdout);
  59         }
  60 
  61          if ( strstr (buf,  "quit" ) != NULL)
  62         {
  63             close(serverSock);
  64              return  0;
  65         }
  66     }
  67      return  0;
  68 }

client.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/****************************************                                                                                                 
   2     > File Name:client.c
   3     > Author:xiaoxiaohui
   4     > mail:1924224891@qq.com
   5     > Created Time:2016年05月21日 星期六 15时35分32秒
   6 ****************************************/
  
   8 #include<stdio.h>
   9 #include<sys/types.h>
  10 #include<sys/socket.h>
  11 #include<unistd.h>
  12 #include<arpa/inet.h>
  13 #include<netinet/in.h>
  14 #include<string.h>
  15 
  16  const  int  PORT = 9090;
  17  const  char * IP =  "127.0.0.1" ;
  18  //const char* IP = "192.168.0.145";
  19  const  int  LEN = 1024;
  20  int  clientSock;
  21  struct  sockaddr_in server;
  22 
  23  int  main()
  24 {
  25 
  26     clientSock = socket(AF_INET, SOCK_DGRAM, 0);
  27 
  28     server.sin_family = AF_INET;
  29     server.sin_addr.s_addr = inet_addr(IP);
  30     server.sin_port = htons(PORT);
  31 
  32      char  buf[LEN];
  33      while (1)
  34     {
  35          memset (buf,  '\0' , LEN);
  36          printf ( "please input: " );
  37          fflush (stdout);
  38          gets (buf);
  39 
  40          int  ret = sendto(clientSock, buf,  strlen (buf), 0, ( struct  sockaddr*)&server,  sizeof (server));
  41          if (ret <= 0)
  42         {
  43              perror ( "sendto" );
  44              continue ;
  45         }
  46 
  47          if ( strcmp (buf,  "quit" ) == 0)
  48         {
  49             close(clientSock);
  50              return  0;
  51         }
  52     }
  53 
  54      return  0;
  55 }

Makefile:

1
2
3
4
5
6
7
8
9
10
11
  1 .PHONY:all                                                                                                                                
   2 all:server client
  
   4 server:server.c
   5     gcc -o $@ $^ -g
   6 client:client.c
   7     gcc -o $@ $^ -g
  
   9 .PHONY:clean
  10 clean:
  11     rm -f server client

执行结果:

wKioL1dEYt2zwgETAABFK7Fs5Cw552.png


wKioL1dEYuzA-1OzAAB70infQRk075.png





三.总结:

UDP套接字编程是不用建立链接的,所以服务器不用listen和accept,客户端不用connect,recvfrom和sendto中有对方的套接字信息。

UDP因为是面向链接的,所以在传输数据过程中比TCP要高效,适用于流媒体或对可靠性要求不高的应用。










本文转自 ye小灰灰  51CTO博客,原文链接:http://blog.51cto.com/10704527/1782717,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
7天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
26天前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
32 0
Linux C/C++之TCP / UDP通信
|
1月前
|
网络协议 Linux
linux学习之套接字通信
Linux中的套接字通信是网络编程的核心,允许多个进程通过网络交换数据。套接字提供跨网络通信能力,涵盖本地进程间通信及远程通信。主要基于TCP和UDP两种模型:TCP面向连接且可靠,适用于文件传输等高可靠性需求;UDP无连接且速度快,适合实时音视频通信等低延迟场景。通过创建、绑定、监听及读写操作,可以在Linux环境下轻松实现这两种通信模型。
31 1
|
1月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
78 1
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
72 6
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
118 3
|
2月前
|
Shell Linux Python
python执行linux系统命令的几种方法(python3经典编程案例)
文章介绍了多种使用Python执行Linux系统命令的方法,包括使用os模块的不同函数以及subprocess模块来调用shell命令并处理其输出。
25 0
|
3月前
|
项目管理 敏捷开发 开发框架
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
49 1