来自菜鸟的悲伤 2021-05-30 23:03 采纳率: 50%
浏览 38
已采纳

写的一个用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;
}



  • 写回答

3条回答 默认 最新

  • 胖哥王老师 单片机领域新星创作者 2021-05-31 07:56
    关注

    先贴上修改好的代码 ,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.推荐,把变量统一定义在函数前面,注意编译过程中的警告,一定要处理掉,因为编译器认为的警告,可能就是隐藏的错误,它无法确认而已。(这条其实是最重要的)

    记得点赞哦

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 用三极管设计—个共射极放大电路
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示