一.udp通信交流

一.udp通信交流。

功能上实现了,通过绑定通信方的ip,进行信息交流。
其中通过线程,来实现了收发信息功能。
并通过信号捕捉来结束交流。

#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>

static int sockfd;
static struct sockaddr_in  cadr;
static void sig_dispose(int sig)//捕捉ctrl+c信号函数
{
	if(SIGINT==sig)
	{
		close(sockfd);
		puts("\nclose!");
		exit(0);
	}

}
static void *udp_send(void *date)//发送函数
{
	char send_buf[120];
	while(1)
	{
		if(cadr.sin_port==0)//端口是否绑定
		{
			puts("send to ip:");//输入要绑定的ip
			cadr.sin_family=AF_INET;
			cadr.sin_port=htons(3210);
			fgets(send_buf,sizeof(send_buf),stdin);
			*(strchr(send_buf,'\n'))='\0';
			inet_pton(AF_INET,send_buf,&cadr.sin_addr);
		}
		puts("please input date:");//输入数据
		fgets(send_buf,sizeof(send_buf),stdin);
		*(strchr(send_buf,'\n'))='\0';
		sendto(sockfd,send_buf,strlen(send_buf),0,(struct sockaddr*)&cadr,sizeof(cadr));

	}
	return NULL;

}
int main(int argc, char const *argv[])
{
	struct sockaddr_in maddr;
	pthread_t tid;
	signal(SIGINT,sig_dispose);

	sockfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sockfd<0)
	{	
		exit(-1);
	}
	bzero(&maddr,sizeof(maddr));
	maddr.sin_family=AF_INET;
	maddr.sin_port=htons(3210);
	//联结对应的客户端
	if (bind(sockfd,(struct sockaddr*)&maddr,sizeof(maddr))!=0)
	{
		close(sockfd);
		exit(-1);
	}
	bzero(&cadr,sizeof(cadr));
	//创建发送的线程
	pthread_create(&tid,NULL,udp_send,NULL);
	
	while(1)
	{
		char recv_buf[120];
		char c_ip[INET_ADDRSTRLEN];//16也可
		socklen_t client_addr_len=sizeof(cadr);
		recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&cadr,&client_addr_len);//接收消息并输出显示
		printf("ip:%s port:%d: %s\n",inet_ntop(AF_INET,&cadr.sin_addr,c_ip,INET_ADDRSTRLEN),ntohs(cadr.sin_port),recv_buf);
//将网络字节序转换并显示
	}

	close(sockfd);
	return 0;
}

测试效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值