写的一个用c实现的udp源码,运行没问题,但是两个程序间无法通信

#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