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这个进程得到监听的端口号信 ...
随机推荐
- .NET-MVC站点部署到windows server2008r2服务器404错误
iis站点搭建 产生原因: 由于服务器上的.net4.0没有进行注册导致的 解决方法: 注册.net 4.0 打开运行-cmd-输入如下命令: C:\WINDOWS\Microsoft.NET\Fra ...
- 怎样改动android系统字体大小
改动字体大小的方法是运用到一个ActivityManagerNative类 首先先在代码宣告 private Configuration mconfig = new Configuration(); ...
- HashMap的工作原理--重点----数据结构示意图的理解
转载:http://blog.csdn.net/qq_27093465/article/details/52209814 HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都 ...
- 算法笔记_041:寻找和为定值的多个数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...
- 算法笔记_023:拓扑排序(Java)
目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...
- 微信群的id
今天网速慢了,竟然把微信群的id卡出来了,记录一下. 格式应该是一个像QQ群一样的数字,然后+@chatroom 看图! 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论.
- Python 访问dict
访问dict 1:可以if判断元素是否存在 2:dict.get('key')我们已经能创建一个dict,用于表示名字和成绩的对应关系:d = { 'Adam': 95, 'Lisa': 85, 'B ...
- SQL server 2008里面通过sys.dm_exec_procedure_stats得到存储过程的执行信息--转
--转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/05/13/sql-server-2008-sys-dm-exec-procedure-stats. ...
- 轻轻的我走了,正如我轻轻的来——Duilib无焦点窗体的实现
在Windows编程中,我们已经习惯了一个窗体从创建到显示并获得焦点. 我们总感觉一个窗体创建出来获得焦点是理所理所当然的.一个窗体仅仅要显示就必须获得焦点.一个新窗体显示时.会收到到WM_SETFO ...
- ORACLE expdp/impdp详解(转)
ORCALE10G提供了新的导入导出工具,数据泵.Oracle官方对此的形容是:Oracle DataPump technology enables Very High-Speed movement ...