#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;
}
写的一个用c实现的udp源码,运行没问题,但是两个程序间无法通信
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注 先贴上修改好的代码 ,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.推荐,把变量统一定义在函数前面,注意编译过程中的警告,一定要处理掉,因为编译器认为的警告,可能就是隐藏的错误,它无法确认而已。(这条其实是最重要的)
记得点赞哦
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 2020长安杯与连接网探
- ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
- ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
- ¥16 mybatis的代理对象无法通过@Autowired装填
- ¥15 可见光定位matlab仿真
- ¥15 arduino 四自由度机械臂
- ¥15 wordpress 产品图片 GIF 没法显示
- ¥15 求三国群英传pl国战时间的修改方法
- ¥15 matlab代码代写,需写出详细代码,代价私
- ¥15 ROS系统搭建请教(跨境电商用途)