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
服务端:
- #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;
- }
|