您的位置:首页 > 编程语言

(一)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


服务端:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  服务器 网络编程 udp