博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【linux高级程序设计】(第十五章)UDP网络编程应用 1
阅读量:4344 次
发布时间:2019-06-07

本文共 2657 字,大约阅读时间需要 8 分钟。

UDP网络通信流程

 

UDP没有connect的过程,故发送数据时需要指明目的地址,不能使用read/write/send/recv. 采用sendto()和recvfrom()

ssize_t sendto (int __fd, __const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ADR __addr, socklen_t __addr_len)

向某一主机发送字节序列

参数1:从本机哪个socket发送数据

参数2:欲发送的数据起始地址

参数3:欲发送的数据大小

参数4:说明数据处理方式

参数5:目的主机地址的起始位置

参数6:目的主机地址在内存中的大小

ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)

接收数据

参数5:存储数据的源地址

两个函数的返回值:成功,返回发送或接收的数据的大小;失败返回-1.

 

例子:UDP通信 发送端发送一句话,接收端接收。

奇怪,这里的发送端又没有bind.

发送端

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv){ struct sockaddr_in s_addr; int sock; int addr_len; int len; char buff[128]; //创建socket IPv4 UDP 阻塞 if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(errno); } else { printf("create socket.\n\r"); } s_addr.sin_family = AF_INET; s_addr.sin_port = htons(7838); if(argv[1]) { s_addr.sin_addr.s_addr = inet_addr(argv[1]); } else { printf("input server ip!\n"); exit(0); } addr_len = sizeof(s_addr); strcpy(buff, "hello i'm here"); len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *)&s_addr, addr_len); if(len < 0) { printf("\n\rsend error.\n\r"); return 3; } printf("send success.\n\r"); return 0;}

接收端

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv){ struct sockaddr_in s_addr; struct sockaddr_in c_addr; int sock; socklen_t addr_len; int len; char buff[128]; //创建socket IPv4 UDP if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(errno); } else { printf("create socket.\n\r"); } memset(&s_addr, 0, sizeof(struct sockaddr_in)); s_addr.sin_family = AF_INET; s_addr.sin_port = htons(7838); s_addr.sin_addr.s_addr = INADDR_ANY; //绑定自己的IP信息 if((bind(sock, (struct sockaddr *)&s_addr, sizeof(s_addr))) == -1) { perror("bind"); exit(errno); } else { printf("bind address to socket.\n\r"); } addr_len = sizeof(c_addr); //一直接收消息 while(1) { //接收消息 len = recvfrom(sock, buff, sizeof(buff) - 1, 0, (struct sockaddr *)&c_addr, &addr_len); if(len < 0) { perror("recvfrom"); exit(errno); } buff[len] = '\0'; printf("recive come from %s:%d message:%s\n\r", inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff); } return 0;}

接收端效果

发送端

 

转载于:https://www.cnblogs.com/dplearning/p/4704707.html

你可能感兴趣的文章
关于jquery中prev()和next()的用法
查看>>
一、 kettle开发、上线常见问题以及防错规范步骤
查看>>
eclipse没有server选项
查看>>
CRC码计算及校验原理的最通俗诠释
查看>>
使用Gitbook来编写你的Api文档
查看>>
jquery扩展 $.fn
查看>>
Markdown指南
查看>>
influxDB的安装和简单使用
查看>>
JPA框架学习
查看>>
JPA、JTA、XA相关索引
查看>>
机器分配
查看>>
php opcode缓存
查看>>
springcloud之Feign、ribbon设置超时时间和重试机制的总结
查看>>
观看杨老师(杨旭)Asp.Net Core MVC入门教程记录
查看>>
UIDynamic(物理仿真)
查看>>
Windows下安装Redis
查看>>
winform非常实用的程序退出方法!!!!!(转自博客园)
查看>>
centos安装vim
查看>>
linux工作调度(计划任务)
查看>>
两个链表的第一个公共节点
查看>>