1.UDP网络编程模型
服务器 | 客户机 |
---|---|
创建套接字 | 创建套接字 |
绑定IP地址 | 发送/接收 |
接收/接收 | |
关闭连接 | 关闭连接 |
注意: UDP协议不是基于连接的通信协议
2.UDP通信编程函数
UDP协议与TCP协议模型除了发送和接收函数不一样,其他函数均相同。
发送函数
函数名:sendto
函数原型:ssize_t sendto(int sockfd,const void *buf,size_t len,int flags,const struct sockaddr *dest_addr,socklen_t addrlen)
函数功能:udp协议模型中发送数据函数
所属头文件:sys/types.h sys/socket.h
函数返回值:成功返回实际的数据个数
参数说明:sockfd :套接字描述符 ,buf:发送数据存放的地址,len:数据量,flags:发送标志付,dest_addr:目的机的地址,addrlen:地址长度接收函数
函数名:recv
函数原型:ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen)
函数功能:接收数据
所属头文件:sys/types.h sys/socket.h
函数返回值:成功返回接收数据的字节数,失败返回-1
参数说明:sockfd :套接字描述符 ,buf:发送数据存放的地址,len:数据量,flags:发送标志付,src_addr:发送方的地址,addrlen:地址长度指针
3.编程实例
利用UDP协议实现一个简单的聊天程序
服务器端程序
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <pthread.h>
#define PORT 2222
static int sockfd;
static struct sockaddr_in server_addr;
static struct sockaddr_in client_addr;
static char buffer[128];
static int n;
static int ADDRLEN;
static pthread_t thread[2];
//3.1 recieve data from client
void * recv_ms()
{
ADDRLEN = sizeof(struct sockaddr);
bzero(buffer,128);
n = recvfrom(sockfd,buffer,128,0,(struct sockaddr *)(&client_addr),&ADDRLEN);
buffer[n] = 0;
printf("%s",buffer);
bzero(buffer,128);
}
//3.2 sent data to client
void * send_ms()
{
fgets(buffer,128,stdin);
sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr *)&client_addr,sizeof(struct sockaddr));
bzero(buffer,128);
}
int main()
{
//1.creat sockfd
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd == -1)
{
printf("creat socket error!\n");
exit(1);
}
//2.1 set bind addr
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//2.2 bind addr
bind(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr));
//3 recieve and send
while(1)
{
pthread_create(&thread[0],NULL,recv_ms,NULL);
pthread_create(&thread[1],NULL,send_ms,NULL);
}
//4.over connect
close(sockfd);
return 0;
}
客户机端程序
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <pthread.h>
#define PORT 2222
int sockfd;
int n;
int ADDRLEN;
struct sockaddr_in server_addr;
char buffer[128];
pthread_t thread[2];
//3.1 send data to server
void *send_ms()
{
ADDRLEN = sizeof(struct sockaddr);
fgets(buffer,128,stdin);
sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr *)&server_addr,sizeof(struct sockaddr));
bzero(buffer,128);
}
//3.2 recieve data from server
void *recv_ms()
{
n = recvfrom(sockfd,buffer,128,0,(struct sockaddr *)(&server_addr),&ADDRLEN);
buffer[n] = 0;
printf("%s",buffer);
bzero(buffer,128);
}
int main(int argc,char **argv)
{
if(argc != 2)
{
printf("Usage : %s server_ip\n",argv[0]);
exit(1);
}
//1.creat socket
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd == -1)
{
printf("creat socket error!\n");
exit(1);
}
//2 set connect server
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_aton(argv[1],&server_addr.sin_addr);
//3.recieve and send
while (1)
{
pthread_create(&thread[0],NULL,send_ms,NULL);
pthread_create(&thread[1],NULL,recv_ms,NULL);
}
//4.over connect
close(sockfd);
return 0;
}