lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lwip-users] Can't process incoming UDP packets after one of hosts i


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.
 
Pozdrawiam,
Grzegorz Niemirowski
http://www.grzegorz.net/
----- Wiadomość oryginalna -----
Wysłano: 25 lipca 2015 01:18
Temat: Re: [lwip-users] Can't process incoming UDP packets after one of hosts is powered down

It is hard to make a judgement without seeing your code. In my own personal experience one no-no is to make sure that the UDP sockets are not shared. I have had no problem running multiple different UDP services in their own threads using different netconn connections.


_______________________________________________
lwip-users mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/lwip-users

reply via email to

[Prev in Thread] Current Thread [Next in Thread]