|
|
@@ -17,9 +17,9 @@ RyanMqttError_e platformNetworkConnect(void *userData, platformNetwork_t *platfo
|
|
|
RyanMqttError_e result = RyanMqttSuccessError;
|
|
|
struct addrinfo *addrList = NULL;
|
|
|
struct addrinfo hints = {
|
|
|
- .ai_family = AF_UNSPEC, // 指定返回地址的地址族
|
|
|
- .ai_socktype = SOCK_STREAM, // 指定返回地址的地址族
|
|
|
- .ai_protocol = IPPROTO_IP}; // 指定socket的协议
|
|
|
+ .ai_family = AF_UNSPEC,
|
|
|
+ .ai_socktype = SOCK_STREAM,
|
|
|
+ .ai_protocol = IPPROTO_TCP};
|
|
|
|
|
|
if (getaddrinfo(host, port, &hints, &addrList) != 0)
|
|
|
{
|
|
|
@@ -27,9 +27,6 @@ RyanMqttError_e platformNetworkConnect(void *userData, platformNetwork_t *platfo
|
|
|
goto exit;
|
|
|
}
|
|
|
|
|
|
- if (NULL == addrList)
|
|
|
- goto exit;
|
|
|
-
|
|
|
platformNetwork->socket = socket(addrList->ai_family, addrList->ai_socktype, addrList->ai_protocol);
|
|
|
if (platformNetwork->socket < 0)
|
|
|
{
|
|
|
@@ -45,6 +42,7 @@ RyanMqttError_e platformNetworkConnect(void *userData, platformNetwork_t *platfo
|
|
|
}
|
|
|
|
|
|
exit:
|
|
|
+
|
|
|
if (NULL != addrList)
|
|
|
freeaddrinfo(addrList);
|
|
|
return result;
|
|
|
@@ -89,11 +87,13 @@ RyanMqttError_e platformNetworkRecvAsync(void *userData, platformNetwork_t *plat
|
|
|
tv.tv_usec = 100;
|
|
|
}
|
|
|
|
|
|
- setsockopt(platformNetwork->socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); // 设置接收超时
|
|
|
+ setsockopt(platformNetwork->socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); // 设置错做模式为非阻塞
|
|
|
|
|
|
recvResult = recv(platformNetwork->socket, recvBuf, recvLen - offset, 0);
|
|
|
- if (recvResult < 0)
|
|
|
+
|
|
|
+ if (recvResult < 0) // 小于零,表示错误,个别错误不代表socket错误
|
|
|
{
|
|
|
+ // 下列3种表示没问题,但需要推出发送
|
|
|
if ((errno == EAGAIN || // 套接字已标记为非阻塞,而接收操作被阻塞或者接收超时
|
|
|
errno == EWOULDBLOCK || // 发送时套接字发送缓冲区已满,或接收时套接字接收缓冲区为空
|
|
|
errno == EINTR)) // 操作被信号中断
|
|
|
@@ -151,11 +151,13 @@ RyanMqttError_e platformNetworkSendAsync(void *userData, platformNetwork_t *plat
|
|
|
tv.tv_usec = 100;
|
|
|
}
|
|
|
|
|
|
- setsockopt(platformNetwork->socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)); // 设置发送超时
|
|
|
+ setsockopt(platformNetwork->socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)); // 设置错做模式为非阻塞
|
|
|
|
|
|
sendResult = send(platformNetwork->socket, sendBuf, sendLen - offset, 0);
|
|
|
- if (sendResult < 0)
|
|
|
+
|
|
|
+ if (sendResult < 0) // 小于零,表示错误,个别错误不代表socket错误
|
|
|
{
|
|
|
+ // 下列3种表示没问题,但需要推出发送
|
|
|
if ((errno == EAGAIN || // 套接字已标记为非阻塞,而接收操作被阻塞或者接收超时
|
|
|
errno == EWOULDBLOCK || // 发送时套接字发送缓冲区已满,或接收时套接字接收缓冲区为空
|
|
|
errno == EINTR)) // 操作被信号中断
|