(一)UDP基本编程步骤
2017-01-04 13:02
267 查看
UDP服务端编程分5步:
1.创建 UDP socket套接字,用socket函数。
2.设置socket的属性,用setsockopt()函数,(可选)
3.往socket绑定包含 IP信息,地址信息的 struct sockaddr_in(IPv4)结构体。用bind()函数
4.循环接收消息,用recvfrom()函数
5.关闭socket套接字
UDP客户端编程分:
1.创建 UDP socket套接字,用socket函数。
2.用sendto()函数往指定的IP,地址发送信息。
UDP的发送函数sendto()和接收函数 recvfrom():
1.sendto():
int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *to , int fromlen);
第一个参数为服务端的udp监听套接字
第二个参数为发送数据的缓冲区
第三个参数为缓存区的大小
第四个参数一般为0;
第五个参数一般为:记录地址信息,ip信息的结构体 。
第六个参数为:第五个参数的大小。
返回值:成功返回实际发送出去的信息的字节数,失败返回-1
2.recvfrom():
int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *from,socket_t *fromlen);
第一个参数为服务端的udp监听套接字
第二个参数为接收数据的缓冲区
第三个参数为缓存区的大小
第四个参数一般为0;
第五个参数一般为:记录地址信息,ip信息的结构体 。
第六个参数为:第五个参数的大小,取地址。
返回值:成功返回接收到的信息的字节数,失败返回-1
头文件:
#ifndef _MYHEAD_H_
#define _MYHEAD_H_
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <dirent.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <pthread.h>
#include <semaphore.h>
#include <poll.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#endif
服务端:
客户端:
1.创建 UDP socket套接字,用socket函数。
2.设置socket的属性,用setsockopt()函数,(可选)
3.往socket绑定包含 IP信息,地址信息的 struct sockaddr_in(IPv4)结构体。用bind()函数
4.循环接收消息,用recvfrom()函数
5.关闭socket套接字
UDP客户端编程分:
1.创建 UDP socket套接字,用socket函数。
2.用sendto()函数往指定的IP,地址发送信息。
UDP的发送函数sendto()和接收函数 recvfrom():
1.sendto():
int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *to , int fromlen);
第一个参数为服务端的udp监听套接字
第二个参数为发送数据的缓冲区
第三个参数为缓存区的大小
第四个参数一般为0;
第五个参数一般为:记录地址信息,ip信息的结构体 。
第六个参数为:第五个参数的大小。
返回值:成功返回实际发送出去的信息的字节数,失败返回-1
2.recvfrom():
int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *from,socket_t *fromlen);
第一个参数为服务端的udp监听套接字
第二个参数为接收数据的缓冲区
第三个参数为缓存区的大小
第四个参数一般为0;
第五个参数一般为:记录地址信息,ip信息的结构体 。
第六个参数为:第五个参数的大小,取地址。
返回值:成功返回接收到的信息的字节数,失败返回-1
头文件:
#ifndef _MYHEAD_H_
#define _MYHEAD_H_
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <dirent.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <pthread.h>
#include <semaphore.h>
#include <poll.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#endif
服务端:
#include"myhead.h" char rbuf[50]; int main() { int sockfd; int size; int ret; int on =1; 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(8888); saddr.sin_addr.s_addr = htonl(INADDR_ANY); //创建udp 的套接字 sockfd = socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { perror("socket failed"); return -1; } //设置端口复用 setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //绑定地址信息,ip信息 ret = bind(sockfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr)); if(ret<0) { perror("sbind failed"); return -1; } int val = sizeof(struct sockaddr); //循环接收客户端发来的消息 while(1) { puts("waiting data"); ret=recvfrom(sockfd,rbuf,50,0,(struct sockaddr*)&raddr,&val); if(ret <0) { perror("recvfrom failed"); } printf("the data :%s\n",rbuf); bzero(rbuf,50); } //关闭udp套接字,这里不可达的。 close(sockfd); return 0; }
客户端:
#include"myhead.h" char wbuf[50]; int main() { int sockfd; int size,on = 1; struct sockaddr_in saddr; int ret; size = sizeof(struct sockaddr_in); bzero(&saddr,size); //设置地址信息,ip信息 saddr.sin_family = AF_INET; saddr.sin_port = htons(8888); saddr.sin_addr.s_addr = inet_addr("192.168.152.128");//192.168.152.128为服务端所在的ip,由于本代码是本机测试,所以写的是自己的ip //创建udp 的套接字 sockfd= socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { perror("failed socket"); return -1; } //设置端口复用 setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //循环发送信息给服务端 while(1) { puts("please enter data:"); scanf("%s",wbuf); ret=sendto(sockfd,wbuf,50,0,(struct sockaddr*)&saddr, sizeof(struct sockaddr)); if(ret<0) { perror("sendto failed"); } bzero(wbuf,50); } close(sockfd); return 0; }
相关文章推荐
- 小心服务器内存居高不下的元凶--WebAPI服务
- 推送技术原理:移动无线网络长连接
- 运维入门
- 利用开源软件打造自己的全功能远程工具
- Linux5.9无人值守安装
- 数据中心和云未来的十二大趋势
- 虚拟化基础架构Windows 2008篇之11-WSUS服务器的安装与配置
- 为Windows Server 2012 R2指定授权服务器
- 为虚拟桌面配置网络负载均衡
- 用vsftp快速搭建ftp服务器
- Linux快速构建apache web服务器
- 服务器监控策略浅谈
- 如何降低服务器采购成本 原理分析
- 建议的服务器分区办法
- 服务器托管六大优势分析
- Erlang实现的一个Web服务器代码实例
- 服务器技术全面解析
- 保护DNS服务器的几点方法小结
- 我国成为全球第二大服务器消费国