1、UDP常用的发送和接收函数

int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);
int sendto(int sockfd,const void *msg,int len,unsigned int flags,struct sockaddr *to,int tolen);

sockfd,buf,len的意义和read,write中的参数是一样的,分别表示套接字描述符,发送或接收的缓冲区及大小。

recvfrom负责从sockfd接收数据,如果from不是NULL,那么在from里面存储了信息来源的情况,如果对信息的来源不感兴趣,可以将from和fromlen设置为NULL。

sendto负责向to发送消息,此时在to里面存储了信息接收方的详细资料。

2、实例演示

服务端程序

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#define SERVER_PORT 8888
#define MAX_MSG_SIZE 1024 void udps_respon(int sockfd)
{
struct sockaddr_in addr;
int n;
socklen_t addrlen;
char msg[MAX_MSG_SIZE]; while ()
{ /* 从网络上读,写到网络上面去 */
memset(msg, , sizeof(msg));
addrlen = sizeof(struct sockaddr);
n = recvfrom(sockfd, msg, MAX_MSG_SIZE, ,
(struct sockaddr*)&addr, &addrlen);
/* 显示服务端已经收到了信息 */
fprintf(stdout, "I have received %s", msg);
sendto(sockfd, msg, n, , (struct sockaddr*)&addr, addrlen);
}
} int main(void)
{
int sockfd;
struct sockaddr_in addr; sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd<)
{
fprintf(stderr, "Socket Error:%s\n", strerror(errno));
exit();
}
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(SERVER_PORT);
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))<)
{
fprintf(stderr, "Bind Error:%s\n", strerror(errno));
exit();
}
udps_respon(sockfd);
close(sockfd);
}

客户端程序

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#define MAX_BUF_SIZE 1024 void udpc_requ(int sockfd, const struct sockaddr_in *addr, socklen_t len)
{
char buffer[MAX_BUF_SIZE];
int n;
while (fgets(buffer, MAX_BUF_SIZE, stdin))
{ /* 从键盘读入,写到服务端 */
sendto(sockfd, buffer, strlen(buffer), , addr, len);
bzero(buffer, MAX_BUF_SIZE); /* 从网络上读,写到屏幕上 */
memset(buffer, , sizeof(buffer));
n = recvfrom(sockfd, buffer, MAX_BUF_SIZE, , NULL, NULL);
if (n <= )
{
fprintf(stderr, "Recv Error %s\n", strerror(errno));
return;
}
buffer[n] = ;
fprintf(stderr, "get %s", buffer);
}
} int main(int argc, char **argv)
{
int sockfd, port;
struct sockaddr_in addr; if (argc != )
{
fprintf(stderr, "Usage:%s server_ip server_port\n", argv[]);
exit();
} if ((port = atoi(argv[]))<)
{
fprintf(stderr, "Usage:%s server_ip server_port\n", argv[]);
exit();
} sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd<)
{
fprintf(stderr, "Socket Error:%s\n", strerror(errno));
exit();
}
/* 填充服务端的资料 */
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if (inet_aton(argv[], &addr.sin_addr)<)
{
fprintf(stderr, "Ip error:%s\n", strerror(errno));
exit();
}
if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -)
{
fprintf(stderr, "connect error %s\n", strerror(errno));
exit();
}
udpc_requ(sockfd, &addr, sizeof(struct sockaddr_in));
close(sockfd);
}

五、用户数据报传输(UDP)的更多相关文章

  1. 运输层2——用户数据报协议UDP

    目录 1. UDP概述 2. UDP首部格式 3. UDP首部检验和计算方法 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议U ...

  2. UDP用户数据报

    UDP 用户数据报协议UDP只在IP的数据报服务之上增加了很少的一个功能,就是复用,分用,差错检测功能.UDP的主要特点是: UDP是无连接的,即在发送数据报之前不需要建立连接(当然发送数据结束的时候 ...

  3. TCP/IP详解学习笔记(8)-- UDP:用户数据报协议

    1.UDP概述 UDP是一种无连接的, 即发送数据前不需要建立连接,因此减小的开销和发送数据的延迟. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表. UDP是面向报文 ...

  4. 【RL-TCPnet网络教程】第16章 UDP用户数据报协议基础知识

    第16章      UDP用户数据报协议基础知识 本章节为大家讲解UDP(User Datagram Protocol,用户数据报协议),需要大家对UDP有个基础的认识,方便后面章节UDP实战操作. ...

  5. udp用户数据报协议

    UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层 ...

  6. 【TCP/IP详解 卷一:协议】第十一章 UDP 用户数据报协议

    11.1 引言 UDP 是一个简单的 面向数据报 的运输层协议:进程的每个 输出操作 都正好产生一个 UDP数据报,并且组装成一份待发送的IP数据报. 这与 TCP 不一样,它是 面向流字符 的协议, ...

  7. 《TCP/IP具体解释卷2:实现》笔记--UDP:用户数据报协议

    用户数据报协议.即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作仅仅产生一个UDP数据报,从而发送 一个IP数据报. 进程通过创建一个Internet域内的SOCK_DGRAM类型的插口 ...

  8. 《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  9. 网络编程—代码—UDP数据报传输

    UDP:数据报传输 1.接收端 public class Udps { //接收端 public static void main(String[] args) throws IOException ...

随机推荐

  1. sublime代码片段功能

    tools - > developer - > new snippet有了这个,你就可以通过iu这两个键,直接弄出自己的模板了,这就很方便了,不用在复制粘贴了.上是代码模板,下面是快捷键, ...

  2. bug_ _小心android-support-v4.jar版本混乱造成的NoClassDefFoundError

    当你的项目出现以下红色提示的时候,要小心了, 因为很可能因为这个错误而导致解释不通的异常出现. Found 2 versions of android-support-v4.jar in the de ...

  3. centos下安装mycat

    1.在某个临时文件夹下下载mycat(此处用的是1.4 RELEASE)wget https://raw.githubusercontent.com/MyCATApache/Mycat-downloa ...

  4. 《c++程序设计》笔记

    本文是学习谭浩强老师的<c++程序设计>后的笔记. 1.概述 c++是贝尔实验室在c语言的基础上发展而来,与c兼容.用c语言写的程序可以不加修改用于c++.从c++的名字可以看出它是c的超 ...

  5. 微信JSSDK上传多张图片

    之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid ...

  6. lassen项目启动

    1.将代码从svn下载下来 2.在下载目录打开命令窗口 shift+鼠标右键 3.mvn  clean install mvn  eclipse:clean mvn  eclipse:eclipse

  7. MS SQL SERVER 数据库日志压缩方法与代码

    MS SQL性能是很不错的,但是数据库用了一段时间之后,数据库却变得很大,实际的数据量不大.一般都是数据库日志引起的!数据库日志的增长可以达到好几百M. DUMP TRANSACTION [数据库名] ...

  8. Machine Schedule(最小覆盖)

    其实也是个最小覆盖问题 关于最小覆盖http://blog.csdn.net/u014665013/article/details/49870029 Description As we all kno ...

  9. linux下udp编程

    #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netine ...

  10. [转]整理索引碎片,提升SQL Server速度

    数据库表A有十万条记录,查询速度本来还可以,但导入一千条数据后,问题出现了.当选择的数据在原十万条记录之间时,速度还是挺快的:但当选择的数据在这一千条数据之间时,速度变得奇慢. 凭经验,这是索引碎片问 ...