【linux高级程序设计】(第十五章)UDP网络编程应用 1
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<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/tcp.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/time.h> int main(int argc, char **argv)
{
struct sockaddr_in s_addr;
int sock;
int addr_len;
int len;
char buff[];
//创建socket IPv4 UDP 阻塞
if((sock = socket(AF_INET, SOCK_DGRAM, )) == -)
{
perror("socket");
exit(errno);
}
else
{
printf("create socket.\n\r");
}
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons();
if(argv[])
{
s_addr.sin_addr.s_addr = inet_addr(argv[]);
}
else
{
printf("input server ip!\n");
exit();
}
addr_len = sizeof(s_addr);
strcpy(buff, "hello i'm here");
len = sendto(sock, buff, strlen(buff), , (struct sockaddr *)&s_addr, addr_len);
if(len < )
{
printf("\n\rsend error.\n\r");
return ;
}
printf("send success.\n\r");
return ;
}
接收端
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/tcp.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/time.h> 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[];
//创建socket IPv4 UDP
if((sock = socket(AF_INET, SOCK_DGRAM, )) == -)
{
perror("socket");
exit(errno);
}
else
{
printf("create socket.\n\r");
}
memset(&s_addr, , sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons();
s_addr.sin_addr.s_addr = INADDR_ANY;
//绑定自己的IP信息
if((bind(sock, (struct sockaddr *)&s_addr, sizeof(s_addr))) == -)
{
perror("bind");
exit(errno);
}
else
{
printf("bind address to socket.\n\r");
}
addr_len = sizeof(c_addr);
//一直接收消息
while()
{
//接收消息
len = recvfrom(sock, buff, sizeof(buff) - , , (struct sockaddr *)&c_addr, &addr_len);
if(len < )
{
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 ;
}
接收端效果

发送端

【linux高级程序设计】(第十五章)UDP网络编程应用 1的更多相关文章
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
- JavaScript高级程序设计:第五章
引用类型 一.object类型: 创建object实例的方式有两种.第一种是使用new操作符后跟Object构造函数,如下所示: var person = new Object(): person ...
- 《javascript高级程序设计》第五章 reference types
第5 章 引用类型5.1 Object 类型5.2 Array 类型 5.2.1 检测数组 5.2.2 转换方法 5.2.3 栈方法 5.2.4 队列方法 5.2.5 重排序方法 5.2.6 操作方法 ...
- 【linux高级程序设计】(第九章)进程间通信-管道 1
Linux操作系统所支持的主要进程间的通信机制. 无名管道 PIPE cat test.txt| grep hello 上面这种管道,将一个命令的输出作为另一个命令的输入,而这种管道是临时的,命令执行 ...
- linux高级管理第十二章--rsync
实验部分 1.安装rsync 2.配置文件 3.配置密码 4.后续 5.为了测试,创建几个文件 配置实时同步 1.调整inotify内核参数 安装inotify-tools 测试同步 编写脚本 验证 ...
- 《JAVASCRIPT高级程序设计》第五章(2)
一.Date类型 Date类型类型用于保存日期,有以下几种创建方式: //获取当前时间 var now = new Date(); //获取当前时间的毫秒数 var nowSecond = Date. ...
- 《JAVASCRIPT高级程序设计》第五章(1)
引用类型是一种将数据和功能组合到一起的数据结构,它与类相似,但是是不同的概念:ECMAScript虽然是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和结构等基本结构.引用类型也被称为“对 ...
- Javascript高级程序设计笔记 <第五章> 引用类型
一.object类型 创建object实例的方式有两种: //第一种使用new操作符跟构造函数 var person= new Object(); person.name="小王" ...
- Javascript高级程序设计复习——第五章引用类型 【原创】
5.1 Object类型 1:创建Object实例的两种方式 ①new构造法 var obj1 = new Object(); 注意大写!不传递参数时可以省略圆括号 obj1.hehe = &quo ...
- Linux高级运维 第五章 Vim编辑器和恢复ext4下误删除的文件-Xmanager工具
5.1 vim主要模式介绍,vim命令模式. 确保系统已经安装了VIM工具 [root@panda ~]# rpm -qf `which vim` [root@panda ~]# rpm -qf ` ...
随机推荐
- 关于DIV内文字垂直居中的写法
最近在写UI,或多或少用到了CSS,在这记录一下,今天用到的DIV内文字垂直居中的写法, 因为所做的项目都是基于WebKit内核浏览器演示的,所以我们今天采用的是-webkit-box的写法: dis ...
- struts2官方 中文教程 系列五:处理表单
先贴个本帖的地址,免得其它网站被爬去了struts2教程 官方系列五:处理表单 即 http://www.cnblogs.com/linghaoxinpian/p/6906298.html 下载本章 ...
- webstorm git提交不成功的
git pull git pull origin master git pull origin master --allow-unrelated-histories
- win7重装后恢复grub和ubuntu14
没有光盘和优盘启动盘,可以在win7下安装easybcd,添加一个启动选项为linux grub2,启动后进入ubutnu,执行如下: sudo -i //取得root权限 fdisk -l ...
- 《Cracking the Coding Interview》——第6章:智力题——题目4
2014-03-20 01:02 题目:无力描述的一道智力题,真是货真价实的智力题,让我充分怀疑自己智力的智力题.有兴趣的还是看书去吧. 解法:能把题目看懂,你就完成80%了,用反证法吧. 代码: / ...
- WebDriver--简单元素操作
clear():清除文本,可用来键盘输入前清除一些input输入框默认的值 send_key(*value):模拟按键输入 click():单击,不止按钮,也可以是文字/图片链接.复选框.单选框.下拉 ...
- 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数
孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 不同类型 ...
- 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成
孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天经过反复折腾,最终基本上算 ...
- 批量部署ssh免密登陆
#!/bin/bash#set -xservers="10.254.192.xx10.254.192.xx10.254.192.xx"passwd="xxxxxxxx&q ...
- HDU 4417 Super Mario ( 离线树状数组 )
把数值和查询放在一起从小到大排序,纪录每个数值的位置,当遇到数值时就更新到树状数组中,遇到查询就直接查询该区间和. #include <cstdio> #include <cstri ...