//打开UDP socket:
int WIFI_OpenUdpSocket(unsigned short Port)
{
int iStatus;
int iAddrSize;
//打开发送socket:
SockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0);
if( SockID < 0 )
{
// error
ASSERT_ON_ERROR(SOCKET_CREATE_ERROR);
}
//绑定本地端口:
sLocalAddr.sin_family = SL_AF_INET;
sLocalAddr.sin_port = sl_Htons(Port);
sLocalAddr.sin_addr.s_addr = 0;
iAddrSize = sizeof(SlSockAddrIn_t);
iStatus = sl_Bind(SockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize);
if( iStatus < 0 )
{
// error
sl_Close(SockID);
ASSERT_ON_ERROR(BIND_ERROR);
}
return SUCCESS;
}
//UDP接收数据:
int WIFI_UdpRecieve(char *buf, int Len, int Timeout)
{
int iStatus = -1;
SlSockAddrIn_t sAddr;
int iAddrSize;
//设置接收超时:
struct SlTimeval_t timeVal;
timeVal.tv_sec = Timeout; // Seconds
timeVal.tv_usec = 0; // Microseconds. 10000 microseconds resolution
sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_RCVTIMEO, (_u8 *)&timeVal, sizeof(timeVal));
iStatus = sl_RecvFrom(SockID, buf, Len, 0,
( SlSockAddr_t *)&sAddr, (SlSocklen_t*)&iAddrSize );
上面代码设计意图是,一次性创建一个socket,绑定本地端口,SockID是全局变量,供以后接收数据函数使用,
问题如下:
1)sl_RecvFrom始终返回-2
2)如果合并上面两个函数,就是把sl_RecvFrom直接放在WIFI_OpenUdpSocket函数里面,是可以接收数据的,难道每次接收都要打开sock,bind,recv这样连续操作吗?
Yonghua Pan:
你创建一个socket之后,就会返回一个ID,就是你的sockID,应该不会放在两个函数就不行的情况,你的WIFI_UdpRecieve里面的buf在哪里分配的?
weilin cai:
回复 Yonghua Pan:
接收缓冲区是全局定义的。
问题的确无法解决,现在只能做在一个函数里面,每次连续的操作:打开->创建->bind->接收,才能正确运行。
发送数据SendTo是可以分别执行的,只有接收不行,这个问题困扰我很久,
Yihong:
回复 weilin cai:
请问你的问题解决了吗?我现在也遇到了这个问题,是否可以交流下?
weilin cai:
回复 Yihong:
没解决,郁闷,
Yonghua Pan:
回复 weilin cai:
你可以参考wifi_audio_app或者serial_wifi例程,它们都是在不同的函数里面去创建套接字和收数据,是没有问题的。
所以是不是你的代码哪里有什么问题。你可以基于例程来修改看看。
weilin cai:
回复 Yonghua Pan:
看了下adudio和serial例程,感觉在socket创建,bind,函数调用上面都差不多,,,,唯一区别是我们的程序是裸奔,并没有使用serial例程那种多任务环境,也没有用到select功能。