程序接收不到UDP数据包的问题,重分悬赏

zuolihua 2007-07-04 10:02:09
服务端在win32平台广播数据包,客户端在linux上接受,目前的发现客户端死活收不到哪怕一个字节的数据,但我用TCPDUMP已经抓到了网络上的广播端口,用netstat -an命令也发现客户端程序已经在指定端口进行监听,可我的recv函数就是不返回,实在想不到什么问题,请大家看看我的代码吧,顶者有分...
int m_Socket;

struct sockaddr_in m_stSrcAddr;



int Init(char* strIP,int port,int nonB )

{

int argp = nonB;

int cbRet;

int nErrorCode;
m_Socket = socket(AF_INET,SOCK_DGRAM,0);
if(m_Socket<0)
{
printf("create socket error!\r\n");
return -1;
}



bzero(&m_stSrcAddr,sizeof(m_stSrcAddr));
m_stSrcAddr.sin_family = AF_INET;

m_stSrcAddr.sin_port = htons( port );
inet_aton(strIP,&m_stSrcAddr.sin_addr);

nErrorCode = bind( m_Socket,(struct sockaddr *)&m_stSrcAddr,sizeof(m_stSrcAddr));
printf("create socket error %s!\r\n",strerror(errno));

if(nErrorCode<0)

{

printf("create socket error %s!\r\n",strerror(errno));
return -1;

}







return 0;

}



void* ThreadEntry( void *ch );

int bThreadRun = 1;

int main(int argc, char* argv[])

{

int nPort = 0;

char cQuit = 0;
pthread_t ntid;
int nErr;

if(argc!=3)

return 0;

nPort = atoi(argv[2]);

if(Init(argv[1],nPort,0)!=0)

{

printf("create socket error!\r\n");

return -1;

}

char szBuf[50] = {0};

long lBufSize = 50;

long nRecved = 0;

SetDecoderInfo("/usr/ebc decode/linux/debug", 10);

while(bThreadRun)

{
printf("ready to recive data!\r\n");


nRecved = recv(m_Socket,szBuf, lBufSize,0);


printf("recive data!\r\n");

ProcessPackage(szBuf+4,nRecved-4);



memset(szBuf, 0, lBufSize);

nRecved = 0;

}


return 0;

}





void* ThreadEntry(void* lpParam)

{

char szBuf[2048] = {0};

long lBufSize = 2048;

long nRecved = 0;

SetDecoderInfo("/usr/ebc decode/linux/debug", 10);

while(bThreadRun)

{

nRecved = recv(m_Socket,szBuf, lBufSize,0);


printf("recive data!\r\n");

ProcessPackage(szBuf+4,nRecved-4);



memset(szBuf, 0, lBufSize);

nRecved = 0;

}

return (void*)0;

}
...全文
898 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
roadingyh 2007-07-19
  • 打赏
  • 举报
回复
直接在指定的端口接收就可以了嘛!.
roadingyh 2007-07-19
  • 打赏
  • 举报
回复
UDP数据包,楼主要客户端监听干吗??
zuolihua 2007-07-19
  • 打赏
  • 举报
回复
问题已解决,没有修改任何代码,发现一个有趣的显示,接受UDP广播数据包时,绑定时不能明确指定IP地址,必须指定INADDR_ANY才能收到
szduweibing 2007-07-10
  • 打赏
  • 举报
回复
程序大概看了一下,虽然不是很清楚,但是既然楼主用的UDP,那么接受数据就应该用recvfrom().
既然是UDP,客户端就不用connect(),那么服务端也就没有必要accept();

这里关键就是要用recvfrom();因为是UDP,无连接的,那么就需要多传一个参数,接受谁传来的数据,
recvfrom()刚好就需要多传一个这样的参数。
还有就是你在客户端调用了bind()函数,本来是可以不调用的。不过调用了也没有关系,但是,从你的程序里面看,就有问题。你这里传入的参数,是服务端的ip,端口等,但是你却和本地用来初始化本地的
struct sockaddr_in m_stSrcAddr;这里你应该本地只需要一个套接字用来接收数据就够了,而从何处接收数据,就需要初始化表示服务端struct sockaddr_in。
mauricewoo 2007-07-08
  • 打赏
  • 举报
回复
应该使用recvfrom
「已注销」 2007-07-05
  • 打赏
  • 举报
回复
bind 后可以是accept->recv
或者是recvfrom

还有就是linux默认是有防火墙的iptables
jobedward 2007-07-05
  • 打赏
  • 举报
回复
首先没看懂你程序,个人理解是你要启动线程处理收到的数据包
其次,建议你使用tcpdump抓包,在Liunx上使用tcpdump -i eth0或者tcpdump host serverip,仔细检查一下网卡是否确实收到了数据包,如果收到了检查是否进入到协议栈中。
zuolihua 2007-07-05
  • 打赏
  • 举报
回复
楼上的意思是我不能用recv而应该用recvfrom????
cceczjxy 2007-07-05
  • 打赏
  • 举报
回复
ed there.

The recv call is normally used only on a connected socket (see connect(2)) and is iden-
tical to recvfrom with a NULL from parameter.
mymtom 2007-07-05
  • 打赏
  • 举报
回复
关注!
plusboy 2007-07-05
  • 打赏
  • 举报
回复
不管是用recv还是用recvfrom都应该在调用前accept.

to umbrella1984:
udp也是可以accept的,你甚至还可以到udp调用connect。
umbrella1984 2007-07-05
  • 打赏
  • 举报
回复
udp也可以accept?

23,127

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧