终端通过GPRS发送UDP数据到固定IP:端口号,socket recvfrom接收不到数据,但却有返回值,如何解决
通过PC发送,服务器可以接收到数据,recvfrom的返回值与PC发送的数据包长度相等。但是通过设备的GPRS模块发送的UDP数据包,却接收不到,recvfrom函数却有...
通过PC发送,服务器可以接收到数据,recvfrom 的返回值与PC发送的数据包长度相等。
但是通过设备的GPRS模块发送的UDP数据包,却接收不到,recvfrom 函数却有返回值,返回值刚好等于UDP数据包的长度。
PC端UDP发送代码:
char *pPack="0000000AS DFKJASLD FJASDKLFJSLAFJAALSDJFKLASDJFLASDFJLASF123";
sprintf(sendBuff,"Message %d is: ok",ncount++); //将ncount的值放入字符串senBuff中
sendto ( sockListener,/*sendBuff*/pPack,strlen(pPack), 0, (SOCKADDR *) &saUdpServ, sizeof (SOCKADDR_IN));
接收代码如下:
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin,saClient; //设置两个地址,sin用来绑定
char cRecvBuff[10000]={0}; //定义接收缓冲区
int nSize,nbSize;
int iAddrLen=sizeof(saClient);
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失败返回-1
return -1;
}
sockListener=socket(AF_INET, SOCK_DGRAM,0);
sin.sin_family = AF_INET;
sin.sin_port = htons(udp_recv_port); //对某一端口进行监听,可以根据需要更改
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0)
{
printf("Can't bind socket to local port!Program stop.\n");//初始化失败返回-1
return -1;
}
while(TRUE)
{
nSize = sizeof ( SOCKADDR_IN );
if((nbSize=recvfrom (sockListener, cRecvBuff,10000,0,(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) //若接收失败则提示错误
{
printf("Recive Error");
break;
}
printf("nbsize="); printf("%d",nbSize);
printf("//cRecvBuff=");
printf("%s",cRecvBuff);
图片中上面三组是PC发的数据,下面两组是GPRS终端发的数据。仅有返回值18.却没数据。 展开
但是通过设备的GPRS模块发送的UDP数据包,却接收不到,recvfrom 函数却有返回值,返回值刚好等于UDP数据包的长度。
PC端UDP发送代码:
char *pPack="0000000AS DFKJASLD FJASDKLFJSLAFJAALSDJFKLASDJFLASDFJLASF123";
sprintf(sendBuff,"Message %d is: ok",ncount++); //将ncount的值放入字符串senBuff中
sendto ( sockListener,/*sendBuff*/pPack,strlen(pPack), 0, (SOCKADDR *) &saUdpServ, sizeof (SOCKADDR_IN));
接收代码如下:
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin,saClient; //设置两个地址,sin用来绑定
char cRecvBuff[10000]={0}; //定义接收缓冲区
int nSize,nbSize;
int iAddrLen=sizeof(saClient);
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失败返回-1
return -1;
}
sockListener=socket(AF_INET, SOCK_DGRAM,0);
sin.sin_family = AF_INET;
sin.sin_port = htons(udp_recv_port); //对某一端口进行监听,可以根据需要更改
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0)
{
printf("Can't bind socket to local port!Program stop.\n");//初始化失败返回-1
return -1;
}
while(TRUE)
{
nSize = sizeof ( SOCKADDR_IN );
if((nbSize=recvfrom (sockListener, cRecvBuff,10000,0,(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) //若接收失败则提示错误
{
printf("Recive Error");
break;
}
printf("nbsize="); printf("%d",nbSize);
printf("//cRecvBuff=");
printf("%s",cRecvBuff);
图片中上面三组是PC发的数据,下面两组是GPRS终端发的数据。仅有返回值18.却没数据。 展开
3个回答
展开全部
UDP是非连接的,发送的报文虽然发送出去了,但是服务器不一定保证接收到。你的有返回值说明你发送出去了,但是不代表服务端收到。还明白。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
展开全部
代码没啥问题,不知道GPRS发送代码是怎样的
追问
GPRS的代码我也不知道,看了下硬件,是SIM900
追答
if((nbSize=recvfrom (sockListener, cRecvBuff,10000,0,(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) 设置一个断点,看到底cRecvBuff中是什么!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不太懂,你可以在说的详细些吗
追问
哪里没说明白?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询