一.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;
}
测试效果如下: