|
From: | Grzegorz Niemirowski |
Subject: | Re: [lwip-users] Can't process incoming UDP packets after one of hosts is powered down |
Date: | Mon, 27 Jul 2015 19:44:46 +0200 |
The code is below, but as I
use sockets and the problems seems to be low level, I don't think showing my
code can help much. Sockets are not shared. I even left just two types of
communication: one UDP and one TCP. So there are only two sockets and they are
different types. And still there is a problem.
UDP code:
void getNTPTime() {
int sock = 0; struct sockaddr_in remote_addr; struct sockaddr_in local_addr; ip_addr_t ipaddr; struct hostent * host; struct ntpPacket ntpPkt; memset(&ntpPkt, 0, sizeof(ntpPkt)); ntpPkt.flags = 0xE3; host = gethostbyname(settings.ntpServer); if (!host) return; ipaddr.addr = ((struct
in_addr *)host->h_addr_list[0])->s_addr;
if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) return; int timeoutMS = 3000; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeoutMS, sizeof(timeoutMS)); memset(&local_addr, 0,
sizeof(local_addr));
local_addr.sin_family = AF_INET; local_addr.sin_addr.s_addr = htonl(INADDR_ANY); local_addr.sin_port = htons(0); if (bind(sock, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in))==0){ memset((char *)&remote_addr, 0, sizeof(remote_addr)); remote_addr.sin_family = AF_INET; remote_addr.sin_addr.s_addr = ipaddr.addr; remote_addr.sin_port = htons(123); if (sendto(sock, &ntpPkt, sizeof(ntpPkt), 0, (struct sockaddr *)&remote_addr, sizeof(remote_addr))!=-1){ socklen_t slen = sizeof(remote_addr); if (recvfrom(sock, &ntpPkt, sizeof(ntpPkt), 0, (struct sockaddr *)&remote_addr, &slen) > 0) { uint32_t seconds = SwapEndianness(ntpPkt.trans_ts_sec); seconds -= 2208988800; setUNIXTime(seconds); printf("time set\n"); } else { printf("ntp timeout\n"); } } } closesocket(sock); } TCP code:
uint8_t sendDBWriterData() {
struct sockaddr_in dbWriterAddr; struct hostent * host; host = gethostbyname(settings.dbwriter.server); if (!host){ return 1; } memset(&dbWriterAddr, 0, sizeof(dbWriterAddr)); dbWriterAddr.sin_len = sizeof(dbWriterAddr); dbWriterAddr.sin_addr.s_addr = ((struct in_addr *)host->h_addr_list[0])->s_addr; dbWriterAddr.sin_port = htons(settings.dbwriter.port); dbWriterAddr.sin_family = AF_INET; int sock;
// socket as a stream if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { return 2; } int timeoutMS = 3000; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeoutMS, sizeof(timeoutMS)); if(connect(sock, (struct sockaddr
*)&dbWriterAddr, sizeof(dbWriterAddr)) <
0)
{ close(sock); return 3; } The rest of the TCP code is not important because
the connection is never established. There is no service running on remote host
or the host is down.
|
[Prev in Thread] | Current Thread | [Next in Thread] |