udp无法recvfrom接收数据
用UDP传输数据本地的客户端和服务端收发没问题,但是用对方机子发过来recvfrom无法接收,但是tcpdump可以嗅探到数据发过来了!
不知道问题何在啊,
服务端代码如下
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERV_PORT 8866
#define MAXLINE 1024
int main(int argc, char **argv)
{
int sockfd;
int fd;
int num_recv;
socklen_t len;
char *recv_buf = malloc(MAXLINE);
struct sockaddr_in servaddr, cliaddr;
fd = open(argv,O_RDWR|O_TRUNC|O_CREAT); //打开文件
if(fd < 0){
perror("open file");
}else{
printf("open file success!\n");
}
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //建立套接子
if(sockfd < 0){
perror("socket");
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET,"192.168.1.100",(struct sockaddr*)&servaddr.sin_addr.s_addr); //192.168.1.100是我的局域网IP
servaddr.sin_port = htons(SERV_PORT);
if(bind(sockfd, (struct sockaddr *) &servaddr,\
sizeof(servaddr))<0){
perror("bind");
}
printf("now begin recvie file \n");
for ( ; ; ) {
num_recv = recvfrom(sockfd, recv_buf, MAXLINE, 0, (struct sockaddr*)&cliaddr, &len); //接收
if(num_recv < 0){
perror("recvfrom");
}
printf("this time recved%d\n",num_recv);
write(fd,recv_buf,num_recv);
}
free(recv_buf);
close(fd);
return 0;
} 把客户端代码也贴出来啊。难不成,帮你分析问题,还得自己写个客户端不行?:wink: 回复 2# heartless_cu
昨晚又试了一下,换台机子可以,我怀疑是机器问题了,正在准备重装系统,
但是我也不明白,用tcp的时候没问题啊,而且tcpdump能嗅谈到别的机子上发过来的udp包,但就是recvfrom无法返回数据。
客户端代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERV_PORT 8866
#define MAXLINE 1024
int main(int argc, char **argv)
{
int sockfd;
int fd;
int num_send,sequence;
char *send_buf = malloc(MAXLINE);
struct sockaddr_in servaddr, cliaddr;
fd = open(argv,O_RDWR|O_TRUNC|O_CREAT);
if(fd < 0){
perror("open file");
}else{
printf("open file success!\n");
}
sockfd = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(argv);
servaddr.sin_port = htons(SERV_PORT);
printf("now begin send file to %s %d \n",argv,ntohs(servaddr.sin_port));
for ( ; ; ) {
*((int *)send_buf) = sequence;
num_send = sendto(sockfd, send_buf, MAXLINE,\
0,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(num_send < 0){
perror("sendto");
}
printf("this time send%d\n",num_send);
}
free(send_buf);
close(fd);
return 0;
} 可以嗅谈到,结果
10:35:46.418975 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.419446 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.419919 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.420576 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.420975 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.421336 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.421731 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.422121 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.422594 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.423013 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.423385 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.423812 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.424281 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.424665 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.425111 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.425857 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.426332 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
但是服务程序没反应。 for ( ; ; ) {
len = sizeof(cliaddr);// 这句是必须有的
num_recv = recvfrom(sockfd, recv_buf, MAXLINE, 0, (struct sockaddr*)&cliaddr, &len); //接收
if(num_recv < 0){
perror("recvfrom");
}
printf("this time recved%d\n",num_recv);
write(fd,recv_buf,num_recv);
} 楼上说的是一个问题。
看你的描述:
1.本地之间可以收发,与远程不可以
2.tcpdump可以抓到远程的数据包
3.换一台机器也可以了
你可以看看防火墙的设置,这也可能导致这种现象。 井蛙夏虫 发表于 2013-12-09 11:40 static/image/common/back.gif
楼上说的是一个问题。
看你的描述:
1.本地之间可以收发,与远程不可以
谢谢!:wink:
确实是防火墙问题,用的是红帽企业版,防火墙没关,开放相应端口可以了。
哦,终于可以继续向下做了,卡了两天了。:em49:
页:
[1]