UDP网络程序设计

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;
}

你可能感兴趣的:(Linux网络编程,UDP协议,UDP编程模型)