linux udp 客户端recvfrom,一直没有数据接收,谁能帮看看这代码哪里出了问题了????

原创 2015年11月18日 16:38:29
void* StartDiscoveryThread(void *arg)
{
	int so_broadcast=1;
	struct sockaddr_in toAddr;  //客户端的网络地址。
	struct sockaddr_in serverAddr;  //服务器端的网络地址。
	char inBuff[DD_BUFF_LEN];
	int sockaddrLen = 0;
	int inLen;

	int ret;
	NETPARAM stRespond = {0};

	int rsock = createUDPSokcet(TF6x0_PORT);

	while(1)
	{
		sockaddrLen = sizeof(toAddr);
		inLen = recvfrom(rsock, inBuff, DD_BUFF_LEN, 0, (struct sockaddr*)&toAddr,(socklen_t*)&sockaddrLen);
		if(inLen<=0)
		{
			DD_DEBUG("recv failed! skip, continue ...");
			sleep(1);
		}
		else
		{
			ret = memcmp(inBuff,CONST_MESSAGE,strlen(CONST_MESSAGE));
			if(0!=ret)
			{
				continue;
			}
			else
			{
				
				////填充需要发送的信息
				netGetIPAddr(DD_IFace, &(stRespond.ip));
				stRespond.dev_model = 1111;

				///toAddr.sin_addr.s_addr = inet_addr("255.255.255.255");
				///toAddr.sin_port 		 = htons(TF6x0_PORT);
				sockaddrLen = sizeof(struct sockaddr);
				ret = sendto(rsock,&stRespond,sizeof(stRespond),0,(struct sockaddr*)&toAddr, sizeof(toAddr));
				if(ret < 0)
				{  
					printf("send failed!\n");                        
				}
				else
				{
					printf("server sned to client(ip:%s port:%d)success ret=%d %d\n", inet_ntoa(toAddr.sin_addr),ntohs(toAddr.sin_port), ret, __LINE__);
					continue;
				}
			}
		}
		sleep(3);
    }
	close(rsock);
	///close(wsock);
	return NULL;
}



int DiscoveryClientHandle(std::list<NETPARAM> &lis)
{
	int sock = -1, retVal = -1;
	int fBroadcast;
	struct sockaddr_in addrSrc;
	struct sockaddr_in addrDst;
	int sockaddrLen = sizeof(struct sockaddr_in);
	NETPARAM resp;
 	char buf[1024] = {0};
	if(sock<0)
	{
		sock = createUDPSokcet(LOCAL_PORT);

		memset(&addrSrc, 0, sockaddrLen);
		addrSrc.sin_family 	 = AF_INET;
		addrSrc.sin_addr.s_addr = htonl(INADDR_BROADCAST);
		addrSrc.sin_port 		 = htons(LOCAL_PORT);
		
		memset(&addrDst, 0, sockaddrLen);
		addrDst.sin_family 	 = AF_INET;
		addrDst.sin_addr.s_addr = htonl(INADDR_BROADCAST);
		addrDst.sin_port 		 = htons(TF6x0_PORT);
		
		retVal = sendto(sock, CONST_MESSAGE,strlen(CONST_MESSAGE),0,(struct sockaddr*)&addrDst, sizeof(addrDst));
		if (retVal <0)
		{
			printf("DiscoveryClientHandle send faile\n");
		}
		else
		{	
			do
			{
				sockaddrLen = sizeof(addrSrc);
				printf("client send %s to(ip:%s, prot:%d) success, now accept the server info line:%d \n",CONST_MESSAGE, inet_ntoa(addrDst.sin_addr),ntohs(addrDst.sin_port), __LINE__);
				retVal = recvfrom(sock, buf, 1024, 0, (struct sockaddr *)&addrSrc, (socklen_t*)&sockaddrLen);
				if(-1 == retVal)		
				{			
					printf("recvfrom error------------------\n");			
					break;	
				}
				else
				{
					printf("get ip(%d.%d.%d.%d) dev_model=%d!\r\n", (resp.ip)&0xff, (resp.ip>>8)&0xff, (resp.ip>>16)&0xff, (resp.ip>>24)&0xff,resp.dev_model);
					lis.push_back(resp);
				}
				usleep(1000);
				

			}while(1);

		}
	}
	
	close(sock);


	return 1;
}


int devDiscovery(void)   
{
	int ret;
	if(0!=Discoveryid) return -1;
	ret= pthread_create(&Discoveryid,0,StartDiscoveryThread,0);
	return ret;
} 
上面代码有一个是个服务端 被搜索的代码,客户端广播一个搜索信号,如果设备接收到客户端的搜索信息,就把设备的ip以及一些信息发送到客户端,客户端对这些信息进行保存,说白了就是一个搜索设备的两端,现在的问题是客户端接收不到信息,一直卡在recvfrom这里,我这里暂时没做超时处理和非阻塞。我想问这里到底什么问题???????????

相关文章推荐

linux中printk的使用方法

内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如 printk("Hello, world!/n");。内核中共提...

VirtualBox 设置桥接模式

Q:在选择网络连接方式时,选择桥接网卡,

Linux环境下 UDP服务端/客户端代码

UDP广播

C# UDP 接收客户端指令并发送数据

while (true) { Socket server = new Socket(AddressFamily.InterNetwork, So...

linux c学习笔记----UDP基础客户/服务编程(sendto,recvfrom)

sendto(经socket传送数据) 相关函数 send , sendmsg,recv , recvfrom , socket 表头文件 #include #incl...

TCP与UDP的异同(服务端接收数据,客户端发送数据)

面向TCP连接的socket通信程序: 服务端:创建套接字,指定协议族(sockaddr_in),绑定,监听(listen),接受链接(accept),发送或接收数据;客户端:创建套接字,指定协议族...
  • wiewei
  • wiewei
  • 2012年03月23日 09:19
  • 1147

由一个论坛帖子, 解决udp 服务器无法返回数据给第一个客户端的问题

帖子见http://bbs.csdn.net/topics/390574101 原来的代码: udp服务器: #include #include #include #include #incl...

使用recvfrom()接收UDP包在Windows和Linux平台的不同表现

recvfrom()接收UDP包时,在Windows和Linux平台的不同表现。
  • smstong
  • smstong
  • 2014年12月25日 16:58
  • 5783

Epoll 的udp通信代码(服务器+客户端)

udp +epoll+多线程服务器 udp_epoll_server.c:
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux udp 客户端recvfrom,一直没有数据接收,谁能帮看看这代码哪里出了问题了????
举报原因:
原因补充:

(最多只允许输入30个字)