diff --git a/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc b/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc index ca11657de78aa06fe4981555d889ec6bfea23f67..e901d6303bf0960b6e40c4e87c25927cdfcd9e06 100644 --- a/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc +++ b/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc @@ -68,7 +68,6 @@ GTMETHSocket::~GTMETHSocket() ssize_t GTMETHSocket::send(void* buf, size_t count) { - ssize_t result = 0; ssize_t newcount = count; memcpy(_sendPacketData, (char*)buf, count); @@ -80,31 +79,47 @@ ssize_t GTMETHSocket::send(void* buf, size_t count) */ if (newcount < ETH_ZLEN - ETH_HLEN) newcount = ETH_ZLEN - ETH_HLEN; - result = sendto(_fd, - _sendPacket, - newcount + sizeof(struct ethhdr), 0, - (struct sockaddr*)&_sockaddr, - sizeof(struct sockaddr_ll)); + ssize_t written = -1; + do { + written = sendto(_fd, + _sendPacket, + newcount + sizeof(struct ethhdr), 0, + (struct sockaddr*)&_sockaddr, + sizeof(struct sockaddr_ll)); - return result - sizeof(struct ethhdr) - (newcount - count); + if ( written < 0 && errno != EINTR && errno != EAGAIN ) { + LOG_WARN(formatString("send, error: %s", strerror(errno))); + return written; + } + } while (written < 0); + + return written - sizeof(struct ethhdr) - (newcount - count); } +/** + * recv a maximum of count bytes, return actually returned bytes + */ ssize_t GTMETHSocket::recv(void* buf, size_t count) { - ssize_t result = -1; + ssize_t received = -1; if (count < ETH_DATA_LEN) return -1; struct sockaddr_ll recvSockaddr; socklen_t recvSockaddrLen = sizeof(struct sockaddr_ll); - result = recvfrom(_fd, _recvPacket, ETH_FRAME_LEN, - 0, (struct sockaddr*)&recvSockaddr, &recvSockaddrLen); - if (result < 0) return -1; + do { + received = ::recvfrom(_fd, _recvPacket, count, + 0, (struct sockaddr*)&recvSockaddr, &recvSockaddrLen); + if ( received < 0 && EINTR != errno && EAGAIN != errno ) { + LOG_WARN(formatString("recv, error: %s", strerror(errno))); + return received; + } + } while (received < 0); - memcpy(buf, _recvPacket + sizeof(struct ethhdr), ETH_DATA_LEN); + memcpy(buf, _recvPacket + sizeof(struct ethhdr), received); - return result - sizeof(struct ethhdr); + return received - sizeof(struct ethhdr); } int GTMETHSocket::open(const char* ifname,