Stos TCP - uIP, nie chce się połączyć z serverem.

0

Witam, używam stosu uIP na mikro kontrolerze atmela, próbowałem na nim uruchomić prosty serwer statystyk - działa, ale gdy chciałem, aby to kontroler łączył się z serwerem, to właśnie już jest problem, kontroler po ~~ 10s od załadowania wysyła zapytanie ARP, dostaje odpowiedź, no i na tym się w sumie kończy, nie ma dalej żadnych pakietów TCP np z flagą SYN, ani nic?

void
hello_world_init(void)
{
  /* We start to listen for connections on TCP port 1000. */
	struct hello_world_state *s = &(uip_conn->appstate);
	uip_ipaddr(ipaddr, 192,168,0,101);
  conn=uip_connect(&ipaddr,HTONS(1000));
}

to jest funkcja init u mnie

void
hello_world_appcall(void)
{
  /*
   * The uip_conn structure has a field called "appstate" that holds
   * the application state of the connection. We make a pointer to
   * this to access it easier.
   */
  struct hello_world_state *s = &(uip_conn->appstate);

  /*
   * If a new connection was just established, we should initialize
   * the protosocket in our applications' state structure.
   */
  if(uip_connected()) {
    PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
  }

  /*
   * Finally, we run the protosocket function that actually handles
   * the communication. We pass it a pointer to the application state
   * of the current connection.
   */
  handle_connection(s);
}

tak wygląda appcall

static int
handle_connection(struct hello_world_state *s)
{
  PSOCK_BEGIN(&s->p);
	PSOCK_READTO(&s->p, '\n');
	
  PSOCK_SEND_STR(&s->p, "Hello. What is your name?\n");
  
  strncpy(s->name, s->inputbuffer, sizeof(s->name));
  PSOCK_SEND_STR(&s->p, "Hello ");
  PSOCK_SEND_STR(&s->p, s->name);
  PSOCK_CLOSE(&s->p);
  
  PSOCK_END(&s->p);
}

i Handle connection

Oczywiście mam pętlę główną od uIP, która wygląda tak jak w przykładzie
https://github.com/aeruder/uip/blob/master/doc/example-mainloop-with-arp.c

Czy ktoś mógłby mi pomóc?
Dziękuję

0

Poradziłem sobie z tym - Metoda odczytu danych z interfejsu nie może być blokująca, tzn jeżeli nie ma żadnych danych do odebrania w pętli głównej, to ma zwrócić od razu zero i tyle.
Poza tym zrobiłem do funkcji clock_time() zliczanie czasu za pomocą sprzętowego timera, żeby obliczenia były faktycznie prawdziwe.

Czyli tak jak np tutaj:

U32 AT91_NetRecv(U8 *Buf)
{
	U32 RetLen=0;
	if(CheckFrameReceived())/*check for a data on interface*/
	{
		RetLen=StartReadFrame();/*Read Data Len*/
		CopyFromFrame_EMAC(Buf, RetLen);/*Copy Data to Buffer*/
		EndReadFrame(); /*Release Data on Interface*/
	}		
	return RetLen;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1