37 void printIP(in_addr ip)
39 char ipstr[INET_ADDRSTRLEN];
40 inet_ntop(AF_INET, &ip, ipstr, INET_ADDRSTRLEN);
50 in_addr hostToIP(
char const * host)
54 if (lwip_getaddrinfo(host, NULL, NULL, &addrinfo) == 0 && addrinfo) {
55 ret = ((sockaddr_in *)addrinfo->ai_addr)->sin_addr;
56 lwip_freeaddrinfo(addrinfo);
68 bool Socket::connect(in_addr host, uint16_t port)
71 m_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
76 sockaddr_in dest_addr;
77 dest_addr.sin_addr = host;
78 dest_addr.sin_family = AF_INET;
79 dest_addr.sin_port = htons(port);
80 m_connected = lwip_connect(m_socket, (sockaddr *)&dest_addr,
sizeof(sockaddr_in)) == 0;
86 uint16_t Socket::checkEndiannessWord(uint16_t value)
88 return m_littleEndian ? value : changeEndiannesWord(value);
92 uint32_t Socket::checkEndiannessDWord(uint32_t value)
94 return m_littleEndian ? value : changeEndiannesDWord(value);
99 int Socket::read(
void * buffer,
size_t length)
107 uint8_t * buf = (uint8_t*) buffer;
110 int bytesRecv = lwip_recv(m_socket, buf, len, MSG_WAITALL);
111 if (bytesRecv == 0) {
122 uint8_t Socket::readByte()
125 return read(&buf, 1) == 1 ? buf : 0x00;
129 uint16_t Socket::readWord()
132 return read(&buf, 2) == 2 ? checkEndiannessWord(buf) : 0;
136 uint32_t Socket::readDWord()
139 return read(&buf, 4) == 4 ? checkEndiannessDWord(buf) : 0;
143 void Socket::readDiscard(
size_t length)
146 for (; length; --length)
151 void Socket::writeFillBytes(
size_t length, uint8_t value)
153 for (; length; --length)
158 void Socket::writeByte(uint8_t value)
164 void Socket::writeWord(uint16_t value)
166 value = checkEndiannessWord(value);
171 void Socket::writeDWord(uint32_t value)
173 value = checkEndiannessDWord(value);
179 int Socket::read(
void * buffer,
size_t maxLength, in_addr * sourceAddress, uint16_t * sourcePort)
183 int bytesRecv = lwip_recvfrom(m_socket, buffer, maxLength, 0, (sockaddr *)&from, (socklen_t *)&fromlen);
185 *sourceAddress = from.sin_addr;
186 *sourcePort = ntohs(from.sin_port);
193 int Socket::write(
void const * buffer,
size_t length)
198 int32_t bytesSent = 0;
200 auto src = (uint8_t
const *) buffer;
201 while (bytesSent < length) {
202 int bytesToSend = imin(TCP_MSS, length - bytesSent);
203 int chunkBytesSent = m_remoteAddress.sin_len == 0 ? lwip_send(m_socket, src, bytesToSend, MSG_DONTWAIT)
204 : lwip_sendto(m_socket, src, bytesToSend, 0, (sockaddr *)&m_remoteAddress, sizeof(m_remoteAddress));
205 int lasterr = getLastError();
206 if (lasterr == EAGAIN || lasterr == EWOULDBLOCK) {
208 }
else if (chunkBytesSent <= 0 || lasterr != 0) {
213 bytesSent += chunkBytesSent;
214 src += chunkBytesSent;
217 m_connected = (bytesSent > 0);
223 int32_t Socket::write(
char const *str)
225 return write((uint8_t
const *)str, strlen(str));
230 int Socket::writeFmt(
char const * format, ...)
233 va_start(ap, format);
234 int len = vsnprintf(
nullptr, 0, format, ap);
236 va_start(ap, format);
238 vsnprintf(buf, len + 1, format, ap);
248 lwip_shutdown(m_socket, SHUT_RDWR);
249 lwip_close(m_socket);
256 void Socket::setNoDelay(
bool value)
258 int one = (int)value;
259 lwip_setsockopt(m_socket, IPPROTO_TCP, TCP_NODELAY, &one,
sizeof(one));
264 void Socket::setRemoteAddress(in_addr remoteAddress, uint16_t remotePort)
266 memset(&m_remoteAddress, 0,
sizeof(sockaddr_in));
267 m_remoteAddress.sin_family = AF_INET;
268 m_remoteAddress.sin_len =
sizeof(sockaddr_in);
269 m_remoteAddress.sin_addr = remoteAddress;
270 m_remoteAddress.sin_port = htons(remotePort);
275 void Socket::setTimeOut(
int timeOut)
277 timeval receiving_timeout;
278 receiving_timeout.tv_sec = timeOut / 1000;
279 receiving_timeout.tv_usec = (timeOut - timeOut / 1000) * 1000;
280 lwip_setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO, &receiving_timeout,
sizeof(receiving_timeout));
286 int32_t Socket::getLastError()
289 socklen_t l =
sizeof(int);
290 lwip_getsockopt(m_socket, SOL_SOCKET, SO_ERROR, (
void *)&r, &l);
This file contains some utility classes and functions.
This file contains RFBClient class.