第三季-第25课-UDP通讯程序设计
第25课-UDP通讯程序设计
25.1 UDP编程模型函数化
UDP编程同样是有服务器和客户机的。在服务器中,用到的函数分别是:socket,bind,recvfrom,sendto,close。在客户机上的函数分别是:socket,sendto,recvfrom,close。针对不同的函数,我们只要学习新的函数sendto和recvfrom就好。
1. 发送数据
(1) 函数名
sendto
(2) 函数原型
ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen);
(3) 函数功能
函数sendto和send很类似。区别在于sendto允许在无连接的套接字上指定一个目标地址。
(4) 所包含的头文件
#include<sys/socket.h>
(5) 返回值
成功:返回发送给的字节数
失败:-1
(6) 参数说明
sockfd:创建套接字的描述符
buf:发送数据所存的地址
bytes:要发送的数据量
flags:发送的标识符
destaddr:数据要发送到的目的的地址
destlen:地址长度
2. 接收数据
(1)函数名
recvfrom
(2)函数原型
ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen);
(3)函数功能
可以得到数据发送者的源地址。
(7) 所包含的头文件
#include<sys/socket.h>
(8) 返回值
成功:已字节计数的消息长度,若无可用消息或对方已经按序结束则返回0
失败:-1
(9) 参数说明
sockfd:创建套接字的描述符
buf:接收到的数据所存的位置
len:接收数据的长度
flags:接收的标志
addr:发送方的地址,读取
addrlen:地址长度的指针
25.2 实例编写
UDP通讯程序设计
udp_server.c
#include<sys/socket.h>
#include<stdio.h>
#include<string.h> //字符串头文件
#include<netinet/in.h> //地址的头文件
#define PORT 8888
#define MSG_SIZE 128
int main()
{
int sockfd;
char buffer[128];//定义存储数据的字节
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int addrlen;
int n;
//创建套件字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
//设置要绑定的地址
bzero(&server_addr, sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET; //网络协议
server_addr.sin_port = htons(PORT); //端口,超过两个字节就要转换
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//表示任意地址,超过两个字节就要转换
//绑定地址
bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));//表示指针的强制转换
//接收数据
while(1)
{
addrlen = sizeof(struct sockaddr);
bzero(buffer, sizeof(buffer));//清零
n = recvfrom(sockfd, buffer, MSG_SIZE, 0, (struct sockaddr *)(&client_addr), &addrlen);
buffer[n] = ‘\0’;
printf("server received: %s\n",buffer);
}
//结束连接
close(sockfd);
return 0;
}
udp_client.c
#include<sys/socket.h>
#include<stdio.h>
#include<string.h> //字符串头文件
#include<netinet/in.h> //地址的头文件
#define PORT 8888
#define BUF_SIZE 128
int main(int argc, char **argv)//区分TCP,这节将地址外传进来,也可以在内部完成固定地址
{
int sockfd;
char buffer[BUF_SIZE];//定义存储数据的字节
struct sockaddr_in server_addr;
if(argc !=2)//我们希望的输入是,程序名+IP地址,如果不对的话,输入提示信息
{
printf("usage: %s server_ip\n ",argv[0]);
exit(1);
}
//创建套件字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);//和服务器的定义一样
//初始化服务器地址
bzero(&server_addr, sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET; //网络协议
server_addr.sin_port = htons(PORT); //端口,超过两个字节就要转换
inet_aton(argv[1],server_addr.sin_addr); /*将argv[1]的内容转换后传给server_addr.sin_addr并且直接转换成网络字节序*/
//发送数据
while(1)
{
printf("please input char!\n");
fgets(buffer, BUF_SIZE,stdin);
sendto(sockfd, buffer, strlen(buffer),0, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));
bzero(buffer, BUF_SIZE);//清零
}
//结束连接
close(sockfd);
return 0;
}
运行:
在复制的终端中分别运行两个编译好的文件。注意格式分别是:./udp_server和./udp_client 192.168.153.128(网络地址根据实际的情况而定)。在udp_client终端输入字符,在udp_server终端可以打印传输过来的字符。
转载于:https://www.cnblogs.com/free-1122/p/11357306.html
第三季-第25课-UDP通讯程序设计相关推荐
- UDP通讯协议广播和组播实现
UDP 通讯协议广播 UDP广播发送端 #include "myhead.h" int main(int argc,char **argv) { int udpsock; ...
- LWIP裸机环境下实现TCP与UDP通讯(转)
源: LWIP裸机环境下实现TCP与UDP通讯
- 基于Delphi API写的UDP通讯类
转载地址:http://www.codefans.net/articles/159.shtml 基于Delphi API写的UDP通讯类,可以广播和单播,类作者:王彦鹏.这个类是作者2007年的时候写 ...
- LWIP裸机环境下实现TCP与UDP通讯
前面移植了LWIP,并且简单的实用了DHCP的功能,今天来使用一下实际的数据通讯的功能 首先是实现TCP客户端,我先上代码 #ifndef __TCP_CLIENT_H_ #define __TCP_ ...
- linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家
Linux UDP socket编程(UDP通讯模型): UDPClient + UDPService. Linux下大多数网络程序都是基于TCP的,很少基于UDP,简单的通讯模型如下,开发时候备用! ...
- C#UDP通讯UdpClient
目录(?)[+] 遇到如下两个问题 远程主机强迫关闭了一个现有的连接的错误 [html] view plaincopy print? class UdpClientClass { /// <su ...
- 宁波医院计算机试题及答案,(宁波市第25届小学生计算机程序设计竞赛试题及答案.doc...
(宁波市第25届小学生计算机程序设计竞赛试题及答案 宁波市第25届中小学生程序设计竞赛组初赛试题 1.在宁波市中小学生程序设计比赛复赛(上机编程)时,以下不能使用的编程语言是: (A)Turbo Pa ...
- UDP 通讯协议 局域网通信发送消息 简单实现
发送端 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; imp ...
- 《和码中文》第一册词组(共25课)
<和码中文>第一册词组(共25课) 每课词组选择要求: 1.词组中的字都是已学过的单字,或本课中学习的单字: 2.每个词组最好至少含一个本课学习的单字: 3.词组要有易读,又有一定的正面意 ...
- UDP通讯之字节流与protobuf转换(C++版)
UDP通讯之字节流与protobuf转换(C++版) 说明 工程内容 VS2017工程介绍 VS2017工程基本设置 数据结构体 UDP服务端server与客户端client类的封装 初始化IP与Po ...
最新文章
- 《构建之法》读后感之项目计划
- 【Spring注解系列11】Spring后置处理器BeanPostProcessor用法与原理
- 四大价值观和12准则
- resteasy_RESTEasy教程第2部分:Spring集成
- selenium webdriver (6) -- iFrame
- 基础算法---二分查找
- python3 datatime,python3处理时间和日期:datetime模块 – Python3教程
- python识别图片文字、并返回文字坐标_简易OCR图片文字识别工具的进一步改进(增加显示图片的功能)...
- Excel数据批量导入导出(基础版)
- python:实现恩尼格玛密码机算法(附完整源码)
- 阿里巴巴宣布传承计划,没有马云的阿里会如何?
- 微信企业号(公众号)开发流程汇总
- 查看linux系统是centos还是ubuntu的方法
- 手算前推回代求解潮流电压分布
- 网易前端微专业课程讨论区问答精选
- 荷兰国旗、quillksort
- 在Google Doc不可用的时候,见识了Google的18国语言道歉, 力压苹果5国
- 双向链表 - DoubleLinkedList
- 电表远程抄表在配电房内的使用
- 胸口的疤痕增生怎么去掉好