udp program
UDP program
UDP常用函数:recvfrom和sendto
- recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr * from, socklen_t *addrlen);
- sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t addrlen);
sockfd, buf,len和read,write一样。
recvfrom负责从sockfd接收数据,如果from不是NULL,那么在from里面存储了信息来源的情况,如果对信息来源不感兴趣,可以将from和addrlen设置为NULL。
sendto负责向to发送信息,此时在to里面存储了收信息方的详细资料。
flags一般设置为0即可。
返回值:成功返回发送或接收的字节数,失败返回-1,并且设置errno。
注:recvfrom中addrlen一定要正确初始化,否则引起错误。
The argument addrlen is a value-result argument, which the caller should initialize before the call to the size of the buffer associated with from, and modified on return to indicate the actual size of the source address. The returned address is truncated if the buffer provided is too small; in this case, addrlen will return a value greater than was supplied to the call.
注:sendto对方主机崩溃或主程序关闭,也可成功返回发送字节数。(UDP直接把数据发送给IP层就算成功了。)
服务器端:socket -> bind -> recvfrom -> sendto -> close
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in.h> char rbuf[]; int main()
{
int sockfd;
int size;
int ret;
int on =;
struct sockaddr_in saddr;
struct sockaddr_in raddr; //设置地址信息,ip信息
size = sizeof(struct sockaddr_in);
bzero(&saddr,size);
saddr.sin_family = AF_INET;
saddr.sin_port = htons();
saddr.sin_addr.s_addr = htonl(INADDR_ANY); //创建udp 的套接字
sockfd = socket(AF_INET,SOCK_DGRAM,);
if(sockfd<)
{
perror("socket failed");
return -;
} //设置端口复用
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //绑定地址信息,ip信息
ret = bind(sockfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr));
if(ret<)
{
perror("sbind failed");
return -;
} int val = sizeof(struct sockaddr);
//循环接收客户端发来的消息
while()
{
puts("waiting data");
ret=recvfrom(sockfd,rbuf,,,(struct sockaddr*)&raddr,&val);
if(ret <)
{
perror("recvfrom failed");
} printf("the data :%s\n",rbuf);
bzero(rbuf,);
}
//关闭udp套接字,这里不可达的。
close(sockfd);
return ;
}
客户端: socket -> sendto -> recvfrom -> close
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in.h> char wbuf[]; int main()
{
int sockfd;
int size,on = ;
struct sockaddr_in saddr;
int ret; size = sizeof(struct sockaddr_in);
bzero(&saddr,size); //设置地址信息,ip信息
saddr.sin_family = AF_INET;
saddr.sin_port = htons();
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//192.168.152.128为服务端所在的ip,由于本代码是本机测试,所以写的是自己的ip //创建udp 的套接字
sockfd= socket(AF_INET,SOCK_DGRAM,);
if(sockfd<)
{
perror("failed socket");
return -;
}
//设置端口复用
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //循环发送信息给服务端
while()
{
puts("please enter data:");
scanf("%s",wbuf);
ret=sendto(sockfd,wbuf,,,(struct sockaddr*)&saddr,
sizeof(struct sockaddr));
if(ret<)
{
perror("sendto failed");
} bzero(wbuf,);
}
close(sockfd);
return ;
}
udp program的更多相关文章
- Java study 1:The note of studying Socket which based UDP
UDP concept: UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参 ...
- Cygwin Run in the Windows(Simulation of UNIX)
Preface Environment Cygwin Run in the Windows(Simulation of UNIX) Resource Cygwin Install:http://cyg ...
- NFS排错案例
1.检验rpcinfo从客户端 # rpcinfo -p nfsserverip ,可以看到服务器端开的tcp/udp端口.默认都是打开的,客户端可以自己选择使用TCP/UDP program ver ...
- java_udp编程
两个重要的类: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/DatagramPacket.html ht ...
- 采用UDP协议的PIC32MZ ethernet bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 经过千辛万苦,今天终于 ...
- 采用UDP协议实现PIC18F97J60 ethernet bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). TCP/IP Stac ...
- [Top-Down Approach]My First C/S Program [Python]
These days I was learning from Computer Networking --A Top-Down Approach by Kurose Ross. I modified ...
- TCP/UDP端口列表
http://zh.wikipedia.org/wiki/TCP/UDP%E7%AB%AF%E5%8F%A3%E5%88%97%E8%A1%A8 TCP/UDP端口列表 本条目可通过翻译外语维 ...
- 获取Windows下某进程监听的TCP/UDP端口
1.在Windows下用CMD netstat命令可以获得当前进程监听端口号的信息,如netstat -ano可以看到IP.port.状态和监听的PID. 那么可以执行CMD这个进程得到监听的端口号信 ...
随机推荐
- poj 1260 Pearls 斜率优化dp
这个题目数据量很小,但是满足斜率优化的条件,可以用斜率优化dp来做. 要注意的地方,0也是一个决策点. #include <iostream> #include <cstdio> ...
- Thinkphp学习笔记-模板赋值
如果要在模板中输出变量,必须在在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值. $this->assign('name',$va ...
- 使用SQL SERVER FOR XML PATH将多个结果集转换成一行并进行去重处理
在一个医药行业的系统中需要根据患者的接触记录ID获取不同接触类型的集合,效果像这样 --患者接触记录信息,一个患者可以有N个不同的接触记录,每个接触记录又有N个接触类型记录 IF OBJECT ...
- PHP快速入门 如何导入网站模板
1 把前面的Guest网站复制到www目录下 2 在地址栏敲http://localhost:8080/guest/ 进入该网站,发现没有导入数据库 3 新建一个标签,在地址栏输入http://loc ...
- OSG 集群渲染 cluster render 支持 Cave 和 powerwall 模式
写了几天.用OSG,实现了集群渲染,感觉还不错,线性加速比还算能够.採用KDTree .八叉树管理场景.场景数据通过UDP和TCP. 不用复制文件,直接在线读取(主节点向渲染节点同步模型数据).效率基 ...
- Python——Shell编程关于Sha-Bang(#!)
Q. #!的名字为什么叫Sha-Bang? A. Sha-Bang是Sharp和Bang的组合词.Sharp for #, Bang for ! 类似的情况是,C#通常被称为C Sharp Q. Sh ...
- QtGui.QGridLayout
The most universal layout class is the grid layout. This layout divides the space into rows and colu ...
- TP框架项目部署linux大小写问题
TP框架项目部署linux大小写问题
- js slice 参数为负值
示例代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF- ...
- Android软件开发之EditText 详解
EditText在API中的结构 java.lang.Objectandroid.view.Viewandroid.widget.TextView android.widget.Edit ...