問題簡單描述為:
我與服務器同事聯調,我的設備為手機平臺,udp方式與服務器通訊,直接用ip連,然后發送資料,服務器能收到。用域名,決議后發送資料服務器一直收不到,不知道什么原因,希望大家指點一下
情況詳細描述如下:
1. 域名決議介面是手機平臺帶的,決議域名后得到的ip沒有問題,與直連的ip和埠一樣
2. bind是成功的,soc_sendto 的回傳值與發送的資料長度一致
3. 傳ip連接流程為:傳ip去決議,直接回傳成功,然后bind, send_to, 服務器能收到
4. 傳域名連接流程為: 傳域名去決議,異步等待決議,決議成功,bind, send_to 服務器一直不能收到
代碼如下,為了簡潔方便看,我刪減到最精簡模式,區域變數申明和容錯部分代碼去掉了,加了部分描述
void _GetHostByNameReq(U32 acctId, int request_id, S8 *hostName, U8 ip[], U16 dstPort, U8 access_id)
{
//傳入的hostName為直連ip或域名,ip[]為存盤決議后得到ip的全域陣列,下面的addr為區域變數,決議后的ip存到addr
result = soc_gethostbyname(0, MOD_MMI, request_id, hostName, (U8*)addr, (U8*)&addr_len, access_id, acctId);
if(result == SOC_SUCCESS) /* hostName為ip時,會回傳SOC_SUCCESS */
{
memcpy(ip, addr, MAX_SOCK_ADDR_LEN);
result = udp_socket_connect( socket id , (U8 *)addr, dstPort);
}
else if(result == SOC_WOULDBLOCK ||result == SOC_ALREADY)
{
/* hostName為域名時,會回傳SOC_WOULDBLOCK,異步等待決議*/
SetProtocolEventHandler(_GetHostByNameRsp, MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
}
}
void _GetHostByNameRsp(void* inMsg)
{
app_soc_get_host_by_name_ind_struct* pMsg = (app_soc_get_host_by_name_ind_struct*)inMsg;
if (pMsg && pMsg->result != FALSE)
{
//異步得到決議后的ip,存到udp_soc_context.ipAddr
memcpy(udp_soc_context.ipAddr, pMsg->addr, pMsg->addr_len);
result = udp_socket_connect(udp_soc_context.socId, udp_soc_context.ipAddr, udp_soc_context.dstPort);
}
}
kal_int32 udp_socket_connect(kal_int8 socketId, U8 ip[], U16 port)
{
sockaddr_struct addr;
memcpy(addr.addr, ip, addr.addr_len);
addr.port = port;
addr.addr_len = 4;
if(socketId == udp_soc_context.socId)
{
addr.sock_type=SOC_SOCK_DGRAM;
ret = soc_bind(udp_soc_context.socId, &addr); //系結
if(ret ==SOC_SUCCESS)
{
udp_send_test(); //發送資料
}
}
}
void udp_send_test(void)
{
sockaddr_struct server_addr;
int ret;
U8 *send_buff = "hello";
server_addr.port = udp_soc_context.dstPort;
server_addr.addr_len = 4;
server_addr.sock_type = SOC_SOCK_DGRAM;
//直連或域名連,最后都從這里發送,2種方式列印出來的server_addr 資料一樣,ip和埠一樣,但域名連服務器一直收不到
ret = soc_sendto(udp_soc_context.socId,(kal_uint8*)send_buff,sizeof(send_buff),0, &server_addr);
StartTimer(UDP_TIMER_ID_OBD, 8000, udp_send_test); //每8秒發一次資料給服務器
}
uj5u.com熱心網友回復:
我丟,自己頂一下,期待大神出現轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/142721.html
標籤:網絡通信
上一篇:傳感器室內日光燈控制
