利用双线程实现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;
}
//-------------------------------------------------------------------