3.1 线程应用例程之UDP收发

利用双线程实现UDP收发,主线程等待线程退出,释放资源

相关函数
    pthread_create():
    pthread_join():
    pthread_cancel():
    pthread_exit()
        //头文件为<pthread.h>
        //create创建线程,第一个参数指向线程标记符的指针,第三个为进程函数运行地.
        //join等待线程接收释放资源
        //cancel外部中断线程
        //exit正常退出线程

代码如下:

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

int network_init(int local_port, char *local_ip);
int network_connect(int sockfd, int target_port, char *target_ip);
void network_send(void *arg);
void network_recv(void *arg);

//pass parameters to the thread function
typedef struct{
	int para1;
} str_para;

//******************initialzation local addr*******************
int network_init(int local_port, char *local_ip)
{
	struct sockaddr_in local_addr;
	socklen_t local_addr_size=0;

	int sockfd=0;
	int bind_status=0;

	//create udp socket
	sockfd=socket(AF_INET,SOCK_DGRAM,0);	
	if(sockfd==-1)
	{
		printf("socket create failed!!\n");
		exit(1);
	}
	else
	{
		printf("socket create successed!!\n");
	}

	//bind local port/IP
	local_addr.sin_family=AF_INET;  //protocol
	local_addr.sin_port=htons(local_port);//port
	local_addr.sin_addr.s_addr=inet_addr(local_ip);//ip
    local_addr_size=sizeof(local_addr);
	bind_status=bind(sockfd,(struct sockaddr*)&local_addr,local_addr_size);
	if(bind_status==-1)
	{
		printf("bind failed!\n");
	}
	else
	{
		printf("bind successed!!!\n");
	}

	return sockfd;
}
//----------------------------------------------------------------------


//*********************connect target add*******************************
int network_connect(int sockfd, int target_port, char *target_ip)
{	
	struct sockaddr_in target_addr;
	socklen_t target_addr_size=0;
	
	int connect_status=0;

	//create target port/ip
	target_addr.sin_family=AF_INET;
	target_addr.sin_port=htons(target_port);
	target_addr.sin_addr.s_addr=inet_addr(target_ip);
	target_addr_size=sizeof(target_addr);
	connect_status=connect(sockfd,(struct sockaddr*)&target_addr,target_addr_size);	

	return connect_status;
}
//---------------------------------------------------

//*****************recvice*************************************
void network_recv(void *arg)
{

	int  recv_len;
	char rx_buff[99];
	int  rx_buff_len=0;
	str_para *sockfd;

	sockfd=arg;
	printf("recv_sockfd=%d\n",sockfd->para1);
	
	while(1)
	{
		memset(rx_buff,0,98);
		recv_len=recv(sockfd->para1,rx_buff,98,0);//recvice socket data
		if(recv_len<=0)
		{
			printf("do recvice data!!\n");	
			break;
		}
		else 
		{
			rx_buff_len=strlen(rx_buff);
			if(rx_buff_len!=0)
			{
				printf("rx_buff_len=%d, rx_data: %s\n",rx_buff_len,rx_buff);
			}
		}
	}
	printf("recv pthread finish \n");
	pthread_exit(NULL);
}
//----------------------------------------------------------


//*******************send***************************************
void network_send(void *arg)
{
	char tx_buff[99];
	int  tx_buff_len=0;
	str_para *sockfd;

	sockfd=arg;
	printf("send_sockfd=%d\n",sockfd->para1);

	while(1)
	{
		memset(tx_buff,0,99);
		printf("send data: ");
		fgets(tx_buff,99,stdin);
		tx_buff_len=strlen(tx_buff);
	//	printf("tx_buff_len=%d,tx_buff: %s",tx_buff_len,tx_buff);
		send(sockfd->para1,tx_buff,tx_buff_len,0);
	}
	printf("pthread_send finish!!!\n");
	pthread_exit(NULL);
}
//--------------------------------------------------------------


//****************main function*****************************************
int main()
{
	int  target_port=0;
	char target_ip[19];
	int  local_port=0;
	char local_ip[19];

	int  sockfd=0;	
	str_para sockfd_para; 

	pthread_t send_pthread;
	pthread_t recv_pthread;
	int  send_pthread_create_status;
	int  recv_pthread_create_status;	
	int  recv_pthread_status;
	int  send_pthread_status;

	int  i=0;
	char buff[99];
	int  buff_len=0;
	
	//input local addr
	printf("input local port and ip :(format:ip port) \n");
	printf("input:");
	scanf("%s%d",local_ip, &local_port);
	do
	{
	}while(getchar()!='\n');
	
	//input target addr
	printf("input target port and ip:(format: port ip)\n");
	printf("input: ");
	scanf("%s%d",target_ip, &target_port);
	do
	{
	}while(getchar()!='\n');
	
	printf("local ip port : %s %d\n",local_ip,local_port);
	printf("target ip port: %s %d\n",target_ip,target_port);
	
	//initialzation socket  
	sockfd=network_init(local_port,local_ip);
	printf("sockfd = %d\n",sockfd);

	//connect target device
	if(network_connect(sockfd, target_port, target_ip)==-1)
	{
		printf("connect target failed!!\n");
	}
	else
	{
		printf("connect target successed!!!\n");
	}
	
	sockfd_para.para1=sockfd;
	//create send udp data pthread 
	send_pthread_create_status=pthread_create(&send_pthread,NULL,(void *)network_send,&sockfd_para);
	if(send_pthread_create_status!=0)
	{
		printf("send_pthread create failed!!\n");
	}
	
	//create recv udp data pthread
	recv_pthread_create_status=pthread_create(&recv_pthread,NULL,(void *)network_recv,&sockfd_para);
	if(recv_pthread_create_status!=0)
	{	
		printf("recv_pthread create failed!!\n");
	}

	send_pthread_status=pthread_join(send_pthread,NULL);
	recv_pthread_status=pthread_join(recv_pthread,NULL);
	if(send_pthread_status==0 && recv_pthread_status==0)
	{
		shutdown(sockfd,2);
		printf("bye,bye!!\n");
	}

	return 0;
}
//-------------------------------------------------------------------

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值