linux下的UDP套接字编程




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




二.相关代码:

server.c:

 1 /****************************************                                                                                                 
  2     > File Name:server.c
  3     > Author:xiaoxiaohui
  4     > mail:[email protected]
  5     > Created Time:2016年05月21日 星期六 15时05分23秒
  6 ****************************************/
  7 
  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     > File Name:client.c
  3     > Author:xiaoxiaohui
  4     > mail:[email protected]
  5     > Created Time:2016年05月21日 星期六 15时35分32秒
  6 ****************************************/
  7 
  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 .PHONY:all                                                                                                                                
  2 all:server client
  3 
  4 server:server.c
  5     gcc -o [email protected] $^ -g
  6 client:client.c
  7     gcc -o [email protected] $^ -g
  8 
  9 .PHONY:clean
 10 clean:
 11     rm -f server client

执行结果:




三.总结:

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

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

时间: 2024-10-13 03:35:04

linux下的UDP套接字编程的相关文章

探索UDP套接字编程

UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务,而TCP提供面向流.提供可靠数据服务.注意,UDP和TCP没有好坏之分,只是二者的适用场景不同罢了. 典型的UDP套接字编程模型是客户端不予服务端建立连接,而只是调用sendto函数来向服务端发送数据,其中必须要指定服务端的信息,包括IP和端口等:服务端不接收来自客户端的连接,而只是调用recvfr

【转】 探索UDP套接字编程

UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务,而TCP提供面向流.提供可靠数据服务.注意,UDP和TCP没有好坏之分,只是二者的适用场景不同罢了. 典型的UDP套接字编程模型是客户端不予服务端建立连接,而只是调用sendto函数来向服务端发送数据,其中必须要指定服务端的信息,包括IP和端口等:服务端不接收来自客户端的连接,而只是调用recvfr

《网络编程》基本 UDP 套接字编程

在前面文章中介绍了<UDP 协议>和<套接字数据传输>.UDP 协议和 TCP 协议不同,它是一种面向无连接.不可靠的传输层协议.在基于 UDP 套接字编程中,数据传输可用函数 sendto 和 recvfrom.以下是基本 UDP 套接字编程过程: sendto 与 recvfrom 函数 这两个函数的功能类似于 write 和 read 函数,可用无连接的套接字编程.其定义如下: /* 函数功能:发送数据: * 返回值:若成功则返回已发送的字节数,若出错则返回-1: * 函数原

apue和unp的学习之旅10——基本udp套接字编程

使用UDP编写的一些常见的应用程序有:DNS(域名系统),NFS(网络文件系统),SNMP(简单网络管理协议). //---------------------------------1.recvfrom函数和sendto函数---------------------------------- #include <sys/socket.h> ssize_t  recvfrom(int sockfd, void* buff, size_t nbytes, int flags, struct so

《网络编程》高级 UDP 套接字编程

概述 UDP 是一个无连接.不可靠的数据报协议,任何可靠传输都需由应用程序提供,例如:超时重传.序列号应答机制,但是它在某些场合使用效率高,方便.它支持广播和多播.有关<基本 UDP 套接字编程>参照该文,这里只是在那个基础上,记录一些在 UDP 编程中容易出现的问题. 辅助数据 辅助数据(也称为控制信息)可通过调用 recvmsg 和 sendmsg 函数使用,这里两个函数的定义可参考文章<高级 I/O>,使用 msghdr 结构体中的 msg_control 和 msg_con

【Python网络编程】利用Python进行TCP、UDP套接字编程

之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器. 2.服务器从其连接套接字读取一行字符. 3.服务器将该行字符转换成大写. 4.服务器将修改后的字符串(行)通过连接套接字再发回给客户机. 5.客户机从其套接字中读取修改后的行,然后将该行在其标准输出(监视器)上打印出来. [TCP]服务器端代码: import socket

TCP和UDP套接字编程 (java实现)

在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程接口! 关于TCP和UDP这里就不作太多介绍了,我们知道TCP是面向连接的,UDP是不面向连接的,TCP可靠,UDP不可靠即可! 我们来设计一个应用来示范一下,流程: 客户机从键盘读取一行字符串,并通过套接字发送到服务器. 服务器从连接的套接字获取这行字符串,并对其进行修改(将小写转为大写),最后再

Unix网络编程学习笔记之第8章 基于UDP套接字编程

一. UDP C/S的典型函数调用 UDP没有像TCP那样的连接,客户端直接sendto向某服务器发送数据,服务器端一直recvfrom阻塞,以接收任何客户端发送的数据. 二. sendto和recvfrom函数 int sendto(int sockfd, const void* buff, size_t nbytes, int flag, const struct sockaddr* to, socklen_taddrlen); int recvfrom(int sockfd, void*

UNP学习笔记(第八章 基本UDP套接字编程)

UDP应用程序客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目的地的地址作为参数. 下图给出典型的UDP客户/服务器程序的函数调用. recvfrom和sendto函数 这两个函数类似于标准的read和write函数,不过需要3个额外的参数 #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags,struct sockaddr *sr