#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<pthread.h>
//定义全局的套接字文件描述符
int sockfd = -1;
//定义全局的结构体变量储存对方的ip和端口
struct sockaddr_in he_addr;
//定义本机的端口和ip
#define MY_PORT 5050
#define MY_IP "192.168.0.128"
//定义接收和发送数据的结构体
typedef struct data
{
char name[50];
}Data;
//创建一个次线程函数接收数据
void *pth_fun(void *pth_agr)
{
Data he_stu_data;
int len = 0;
while(1)
{
len = sizeof(he_addr);
if(-1 > recvfrom(sockfd,(void *)&he_stu_data,sizeof(he_stu_data),0,(struct sockaddr*)&he_addr,&len))
{
perror("recvfrom");
exit(-1);
}
printf("he_ip:%s\nhe_port:%d\n",inet_ntoa(he_addr.sin_addr),ntohs(he_addr.sin_port));
printf("stu_name:%s\n",he_stu_data.name);
}
}
int main(int argc,char **argv)
{
sockfd = socket(PF_INET,SOCK_DGRAM,0);
if(sockfd == -1)
{
perror("sockfd");
exit(-1);
}
struct sockaddr_in my_addr;
my_addr.sin_addr.s_addr = inet_addr(MY_IP);
my_addr.sin_port = htonl(MY_PORT);
my_addr.sin_family = PF_INET;
if(-1 == bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr)))
{
perror("bind");
exit(-1);
}
Data stu_data = {0};
pthread_t pid;
pthread_create(&pid,NULL,pth_fun,NULL);
while(1)
{
he_addr.sin_family = AF_INET;
he_addr.sin_addr.s_addr = inet_addr(argv[1]);
he_addr.sin_port = htons(atoi(argv[2]));
printf("input stu_name\n");
scanf("%s",stu_data.name);
if(-1 == sendto(sockfd,(void *)&stu_data,sizeof(stu_data),0,(struct sockaddr *)&he_addr,sizeof(he_addr)))
{
perror("sendto");
exit(-1);
}
}
return 0;
}
先贴上修改好的代码 ,IP自己调整一下
//定义本机的端口和ip
#define MY_PORT 5050
#define MY_IP "192.168.31.230"
//定义接收和发送数据的结构体
typedef struct data
{
char name[50];
}Data;
//创建一个次线程函数接收数据
void *pth_fun(void *pth_agr)
{
int sockfd = -1;
struct sockaddr_in he_addr;
struct sockaddr_in my_addr;
Data he_stu_data;
int len = 0;
sockfd = socket(PF_INET,SOCK_DGRAM,0);
if(sockfd == -1)
{
perror("sockfd_rec");
exit(-1);
}
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_addr.s_addr = inet_addr(MY_IP);
my_addr.sin_port = htons(MY_PORT);
my_addr.sin_family = AF_INET;
if(-1 == bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr)))
{
perror("bind");
exit(-1);
}
while(1)
{
int rec=0;
len = sizeof(he_addr);
rec=recvfrom(sockfd,(void *)&he_stu_data,sizeof(he_stu_data),0,(struct sockaddr*)&he_addr,&len);
if(-1 > rec)
{
perror("recvfrom");
exit(-1);
}
else if(rec==-1)
{
continue;
}
else
{
printf("rec:%d\n",rec);
printf("he_ip:%s\nhe_port:%d\n",inet_ntoa(he_addr.sin_addr),ntohs(he_addr.sin_port));
printf("stu_name:%s\n",he_stu_data.name);
}
}
}
int main(int argc,char **argv)
{
int sockfd = -1;
struct sockaddr_in he_addr;
Data stu_data = {0};
pthread_t pid;
pthread_create(&pid,NULL,pth_fun,NULL);
sockfd = socket(PF_INET,SOCK_DGRAM,0);
if(sockfd == -1)
{
perror("sockfd");
exit(-1);
}
memset(&he_addr, 0, sizeof(he_addr));
he_addr.sin_family = AF_INET;
he_addr.sin_addr.s_addr = inet_addr(argv[1]);
he_addr.sin_port = htons(atoi(argv[2]));
while(1)
{
printf("input stu_name\n");
scanf("%s",stu_data.name);
if(-1 == sendto(sockfd,(void *)&stu_data,sizeof(stu_data),0,(struct sockaddr *)&he_addr,sizeof(he_addr)))
{
perror("sendto");
exit(-1);
}
}
return 0;
}
这里介绍一些修改的问题
1.socket不能两个线程公用,接收和发送各自用各自创建的。
2.发送socket不需要bind过程
3.代码中出现的my_addr.sin_port = htonl(MY_PORT);可以详细去了解htonl和htons的区别。
4.推荐,把变量统一定义在函数前面,注意编译过程中的警告,一定要处理掉,因为编译器认为的警告,可能就是隐藏的错误,它无法确认而已。(这条其实是最重要的)
记得点赞哦
udp通讯是互相发送到对方的IP和端口,检查一下IP,端口有没有写反。
您的问题已经有小伙伴解答了,请点击【采纳】按钮,采纳帮您提供解决思路的答案,给回答的人一些鼓励哦~~
ps:开通问答VIP,享受5次/月 有问必答服务,了解详情↓↓↓
【电脑端】戳>>> https://vip.csdn.net/askvip?utm_source=1146287632
【APP 】 戳>>> https://mall.csdn.net/item/52471?utm_source=1146287632