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. python随文档

    UNIX网络编程--socket的keep http://www.68idc.cn/help/opersys/unixbsd/20150731471448.html 云计算学习和实践: 原创<每 ...

  2. memcache 内部原理实现

    Lazy Expiration memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期.这 种技术被称为 lazy(惰性)expiration.因此,mem ...

  3. SQL Server 2005中的分区表(二):如何添加、查询、修改分区表中的数据(转)

    在创建完分区表后,可以向分区表中直接插入数据,而不用去管它这些数据放在哪个物理上的数据表中.接上篇文章,我们在创建好的分区表中插入几条数据 insert Sale ([Name],[SaleTime] ...

  4. eclipse对项目整理分类

    1.Eclipse提供了工作集(Working Set)的功能,它可以用来划分这些项目. 在Package Explorer视图的下拉菜单里选择Show->Working Sets,然后还是在它 ...

  5. 九度OJ1468

    这道题其实就是个很简单的静态链表,需要注意的是,地址一共有5位,最后输出的时候如果之前是使用int类型存储地址的话,一定要强制规定输出的位数(5位),否则有可能会将高位省略.(如地址00001输出为1 ...

  6. centos 6.5 安装 buildbot-slave 0.8.9

    公司服务器多数都用的centos,这个是大环境,改不了,只好研究怎么安装buildbot-slave. buildbot-master倒是没有问题,可控,自己弄了一个ubuntu14来玩. cento ...

  7. [SQL]SQL删除数据的各种方式总结

    SQL删除数据的各种方式总结 一.使用DELETE从表中删除目标行.记录每次删除操作.如: USE pubs DELETE FROM authors WHERE au_lname = 'McBadde ...

  8. [datatable]两个DataTable 连接

    using System; using System.Collections.Generic; using System.Text; using System.Data; namespace Cons ...

  9. 【转】Bash脚本实现批量作业并行化

    首先附上自己常用的代码 ---------------------------------------------------------------------------------------- ...

  10. 【转】交叉编译faac共享库

    转自:http://blog.csdn.net/cjj198561/article/details/38382889 编译准备 1.代码下载 在mac下面执行:wget http://download ...