[Programmation] Time out connexion socket Ethernet
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Time out connexion socket Ethernet



  1. #1
    PierreBoss

    Time out connexion socket Ethernet


    ------

    Bonjour,

    Je travaille avec le microcontrôleur SAM3X8E et sous Atmel Studio 7.

    J'aimerai réussir à envoyer des données depuis mon PC à ma carte de programmation par le biais de bus Ethernet TCP/IP.
    Côté PC, j'utilise la librairie Socket de python pour la création de socket.
    Côté carte j'utilise les librairies emac et ethernet_phy pour détecter les pings et détecter la présence ou non de mon câble Ethernet (ces 2 fonctionnalités fonctionnent) et la librarie lwip 1.4.0 pour la création de socket.

    Mon problème est que je n'arrive pas à connecter le socket de mon PC (Client) à celui de ma carte (Serveur). J'obtiens toujours une erreur de timeout. Niveau soft je ne vois pas où se trouve l'erreur et niveau Hardware j'ai essayé de rajouter le port à mon firewall, désactiver mon firewall, ... Mais rien n'y fait j'ai toujours cette erreur de Timeout.

    Voici des screens de scan nmap de mon PC et de ma carte :
    Capture d’écran 2021-07-06 133420.jpg
    Capture d’écran 2021-07-06 133453.jpg

    Et voici mon code :
    Coté carte :
    Code:
    int main(void)
    {
            /* Initialize interrupts */
    	irq_initialize_vectors();
    	cpu_irq_enable();
    	
    	/* Initialize the SAM system */
    	sysclk_init();
    	
    	/* Setup of the I/Os, DAC and ADC PINs */
    	board_init();
    
            /* Setup Ethernet */
    	init_eth();
    	lwip_init();
    
            /* Wait for the Ethernet cable */
            while(ethernet_phy_auto_negotiate(EMAC, BOARD_EMAC_PHY_ADDR) != EMAC_OK);
    	while(ethernet_phy_set_link(EMAC, BOARD_EMAC_PHY_ADDR, 1) != EMAC_OK);
    	
            /* Socket */
    	struct tcp_pcb *pcb;
    	
    	pcb = tcp_new();
    	tcp_bind(pcb, 192.168.1.40, 5050);
    	pcb = tcp_listen(pcb);
    	tcp_accept(pcb, connectionAccepted);              // La fonction Callback connectionAccepted fait juste un print pour me dire que le socket est bien connecté, mais cela n'arrive jamais
    	printf("state of the socket : %s \r\n", getSocketState(pcb->state));
    	printf("port du socket : %i \r\n", pcb->local_port);
    	printf("Socket ready \r\n");
    	
    	uint32_t ul_frm_size = 0;
    	
    	while(1){
                    /* To receive ethernet packet (ça ça marche)*/ 
    		if (emac_dev_read(&gs_emac_dev, (uint8_t *) gs_uc_eth_buffer, sizeof(gs_uc_eth_buffer), &ul_frm_size) == EMAC_OK) {
    			emac_process_eth_packet((uint8_t *) gs_uc_eth_buffer, ul_frm_size);
    		}
    	}
    }
    Les printf pourtant semblent bons :
    Capture d’écran 2021-07-06 134108.jpg

    Coté PC :
    Code:
    IP_PORT = 5050
    BAUD_RATE = int(115200)
    arduino_IP_address = 192.168.1.40
    
    try
         if client is None:
             client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             client.settimeout(4)
             client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
             client.connect((arduino_IP_address, IP_PORT))
    except OSError as err:
             print("lol", err)
    Voilà l'erreur que j'obtiens :
    Capture d’écran 2021-07-06 134423.jpg

    Pourtant j'arrive bien à ping ma carte et j'ai l'impression que le socket côté carte est bien disponible donc je ne comprend pas pourquoi j'ai ce time out...

    Avez vous des idées ?

    -----

  2. #2
    umfred

    Re : Time out connexion socket Ethernet

    question peut-être bête mais je ne vois pas les guillemets autour de l'adresse IP dans les 2 codes, un oubli ici ou un problème de copier/coller?
    Je me demande si dans le bind, on ne doit pas mettre IP_ADRR_ANY pour dire d'accepter toutes les adresses de connexion
    tcp_bind(pcb,IP_ADDR_ANY,5050)
    arduino_IP_address="192.168.1. 40"

  3. #3
    PierreBoss

    Re : Time out connexion socket Ethernet

    Au lieu d'utiliser les fonction de tcp.h pour établir la connexion entre mon PC et ma carte je suis en train d'utiliser les fonctions de socket.h :

    Code:
    int sock;
    sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0){
    	printf("sock problem \r\n");
    	return 0;	
    }
    if(lwip_bind(sock, (struct sockaddr*)&localaddr, sizeof(localaddr)) < 0){
    	lwip_close(sock);
    	printf("bind problem \r\n");	
    }
    if(lwip_listen(sock, 1) < 0){
    	lwip_close(sock);
    	printf("listen problem \r\n");		
    }
    if(lwip_accept(sock, (struct sockaddr*)&addr_in, &length_addr_in) < 0){
    	lwip_close(sock);
    	printf("accept problem \r\n");		
    }
    printf("socket ready \r\n");
    Pour l'instant j'ai des problème à la création de mon socket (il est égal à -1). En remontant le problème pour trouver la source je crois que j'ai trouvé quelque chose de bizarre. Dans le fichier api_msg.c, dans la fonction netconn_alloc() il y a cette ligne de code :
    Code:
    conn = (struct netconn *)memp_malloc(MEMP_NETCONN);
    Sauf que je n'arrive pas à trouver l'initialisation de la variable MEMP_NETCONN. mon conn est donc égal à NULL et empêche la création de socket....
    Quand je regarde pour l'implémentation de cette variable, il me renvoie à cette structure :
    Code:
    typedef enum {
    #define LWIP_MEMPOOL(name,num,size,desc)  MEMP_##name,
    #include "lwip/memp_std.h"
      MEMP_MAX
    } memp_t;
    Je poursuis mes recherches pour voir comment corriger ça !
    Dernière modification par PierreBoss ; 07/07/2021 à 10h12.

  4. #4
    PierreBoss

    Re : Time out connexion socket Ethernet

    Enfaite dans mon code j'ai bien mis tcp_bind(pcb,IP_ADDR_ANY,5050) mais quand j'ai posté le message j'ai mis directement l'adresse IP pour pas vous embrouiller.
    Pour le code côté PC c'est pareil ! Normalement j'ai une class ect.. mais j'ai simplifier en montrant que mon problème mais il y'a bien des guillemets.

  5. A voir en vidéo sur Futura
  6. #5
    PierreBoss

    Re : Time out connexion socket Ethernet

    Bon après de plus en plus de recherche mon erreur provient du fait que dans le fichier memp.c j'ai un soucis avec la fonction memp_malloc(memp_t type) :
    Code:
    memp_malloc(memp_t type)
    {
      struct memp *memp;
      SYS_ARCH_DECL_PROTECT(old_level);
      LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
    
      SYS_ARCH_PROTECT(old_level);
    #if MEMP_OVERFLOW_CHECK >= 2
      memp_overflow_check_all();
    #endif /* MEMP_OVERFLOW_CHECK >= 2 */
    
      memp = memp_tab[type];
      
      if (memp != NULL) {
    	  printf("good");
        memp_tab[type] = memp->next;
    #if MEMP_OVERFLOW_CHECK
        memp->next = NULL;
        memp->file = file;
        memp->line = line;
    #endif /* MEMP_OVERFLOW_CHECK */
        MEMP_STATS_INC_USED(used, type);
        LWIP_ASSERT("memp_malloc: memp properly aligned",
                    ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0);
        memp = (struct memp*)(void *)((u8_t*)memp + MEMP_SIZE);
      } else {
    	  printf("bad");
        LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type]));
        MEMP_STATS_INC(err, type);
      }
    
      SYS_ARCH_UNPROTECT(old_level);
    
      return memp;
    }
    Je ne sais pas pourquoi mais mon memp = memp_tab[MEMP_NETCONN]; retourne NULL...

  7. #6
    PierreBoss

    Re : Time out connexion socket Ethernet

    Voici mes options lwipopts.h par rapport à la mémoire :

    Code:
    /* ---------- Memory options ---------- */
    
    /* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
     * lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
     * byte alignment -> define MEM_ALIGNMENT to 2. */
    #define MEM_ALIGNMENT           4
    
    /* MEM_SIZE: the size of the heap memory. If the application will send
     * a lot of data that needs to be copied, this should be set high. */
    #define MEM_SIZE                3 * 1024
    
    /* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
     * sends a lot of data out of ROM (or other static memory), this
     * should be set high. */
    #define MEMP_NUM_PBUF			6
    
    /* Number of raw connection PCBs */
    #define MEMP_NUM_RAW_PCB                1

Discussions similaires

  1. Connexion par socket entre smartphone Android et application Java sur PC
    Par inviteb4a5e105 dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 04/05/2014, 19h24
  2. Connexion Ethernet
    Par wakrime dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 15/07/2008, 19h15
  3. Connexion ethernet
    Par invite532d7236 dans le forum Électronique
    Réponses: 3
    Dernier message: 01/04/2008, 19h34
  4. Connexion USB ou ethernet
    Par Fistos dans le forum Internet - Réseau - Sécurité générale
    Réponses: 22
    Dernier message: 29/07/2007, 17h35
  5. connexion ethernet
    Par invite9f939480 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 28/07/2006, 18h08
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...