UDP通信例子

1、UDP server端(非阻塞)

#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <fcntl.h>
#define RecvPort 12346
void Perror(const char *s)
{
    perror(s);
    exit(EXIT_FAILURE);
}
 
//设置非阻塞
static void setnonblocking(int sockfd) {
    int flag = fcntl(sockfd, F_GETFL, 0);
    if (flag < 0) {
        Perror("fcntl F_GETFL fail");
        return;
    }
    if (fcntl(sockfd, F_SETFL, flag | O_NONBLOCK) < 0) {
        Perror("fcntl F_SETFL fail");
    }
}
static void *UDPServer_thread()
{
   	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if (0 > sockfd)
    {
		perror("sockfd");
        return -1;
    }
	setnonblocking(sockfd);
    //准备地址
    struct sockaddr_in addr = {};
    addr.sin_family = AF_INET;//ipv4
    addr.sin_port = htons(RecvPort);//端口号
    addr.sin_addr.s_addr = htonl(INADDR_ANY);//我的ip地址
    //绑定
    int ret = bind(sockfd,(struct sockaddr_in *)&addr,sizeof(addr));
    if (0 > ret)
    {
        perror("bind");
        return -1;
    }
    struct sockaddr_in src_addr ={};
    socklen_t addr_len = sizeof(struct sockaddr_in);
	printf("********UDPServer start********\n");
	while(1){
		int n;
		char buff[1024] = {0};
		char msg[1024] = "hello client";
        //接收数据和来源的ip地址
        n = recvfrom(sockfd,buff,sizeof(buff),0,(struct sockaddr_in *)&src_addr,&addr_len);
		if(n == -1)
			continue;
		buff[n]='\0';
		//memcpy(msg,&buf[10],n-10);
		printf("UDP server revc %d,:%s\n",n,buff);
        n = sendto(sockfd, msg, sizeof(msg), 0, (struct sockaddr *)&src_addr, sizeof(src_addr));
        if (n < 0)
        {
            perror("sendto");
            close(sock);
        }
	    printf("This is a UDP SERVER send %d\n",n);
		//message_handler(msg);
	}
	printf("********UDPServer end********\n");
	close(sockfd);
}
void Start_UDPServer_Thread(void)
{
	pthread_t thread;
    pthread_create(&thread, NULL, UDPServer_thread, NULL);
   	
}
 int main()
{
    while(1){
        Start_UDPServer_Thread();
    }
    return 0;
}

2、UDP client端(非阻塞)

#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <fcntl.h>
#define SendPort 12346
#define TargetIp "192.168.1.1"
void Perror(const char *s)
{
    perror(s);
    exit(EXIT_FAILURE);
}
 
//设置非阻塞
static void setnonblocking(int sockfd) {
    int flag = fcntl(sockfd, F_GETFL, 0);
    if (flag < 0) {
        Perror("fcntl F_GETFL fail");
        return;
    }
    if (fcntl(sockfd, F_SETFL, flag | O_NONBLOCK) < 0) {
        Perror("fcntl F_SETFL fail");
    }
}

static int udp_send_msg()
{
	struct sockaddr_in addr = {};
	int sock;
	char buff[1024] ="hello server";
	char recvbuff[1024] ={0};
	if((sock=socket(AF_INET, SOCK_DGRAM, 0)) <0)
    {
        perror("socket");
        exit(1);
    }
	setnonblocking(sock);//设置非阻塞
	bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(SendPort);
    addr.sin_addr.s_addr = inet_addr(TargetIp);
    if(addr.sin_addr.s_addr == INADDR_NONE)
    {
        printf("Incorrect ip address!");
        close(sock);
        exit(1);
    }
	
    int addr_len = sizeof(addr);
    int n;
    int i=0;
    n = sendto(sock, buff, sizeof(buff), 0, (struct sockaddr *)&addr, sizeof(addr));
    if (n < 0)
    {
        perror("sendto");
        close(sock);
    }
	printf("This is a UDP client send %d\n",n);
	memset(recvbuff,0, sizeof(recvbuff));
    while(true){
    usleep(100000);//100ms读一次recbuff
    i=i+1;
    n = recvfrom(sock, recvbuff,sizeof(recvbuff), 0, (struct sockaddr *)&addr, &addr_len);
    if(i>10)
        break;//一秒内未收到数据退出
    if(n ==-1)
        continue;
    else
        break;
	}
	recvbuff[n]='\0';
	printf("This is a UDP client 3 recv strlen :%d, %s\n",n,recvbuff);
	close(sock);
	return 0;
}
int main()
{
    udp_send_msg();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值