From 57358bd7d3051225174f3ca676b4cdf617963cb1 Mon Sep 17 00:00:00 2001 From: Mazet Laurent Date: Wed, 21 May 2025 16:18:20 +0200 Subject: [PATCH] work for udp --- sap.c | 84 ++++++++++++++++++++++++++++-------------------------- sap_test.c | 11 ++++--- 2 files changed, 51 insertions(+), 44 deletions(-) diff --git a/sap.c b/sap.c index 7d7bab0..bd5e656 100644 --- a/sap.c +++ b/sap.c @@ -68,12 +68,9 @@ void free_saps (void) VERBOSE (sap, TRACE, PRINTF ("free_saps\n")); - int i; - for (i = 0; i < MAX_SAP_NUMBER; i++) { - if (SAP_list[i]) { - free (SAP_list[i]); - SAP_list[i] = NULL; - } + for (int i = 0; i < MAX_SAP_NUMBER; i++) { + free (SAP_list[i]); + SAP_list[i] = NULL; } } @@ -129,14 +126,13 @@ static inline int sap_create_and_listen (char *local_address, int doListen, VERBOSE (sap, TRACE, PRINTF ("sap_create_and_listen\n")); SAP_addr_t addr; - int sap; + int sap = 0; VERBOSE (sap, DEBUG, PRINTF ("SAP local addr %s\n", local_address)); - int rc = parse_url (local_address, &addr); - - if (rc < 0) { + if (parse_url (local_address, &addr) < 0) { + VERBOSE (sap, ERROR, PRINTF ("can't parse url\n")); errno = EINVAL; - return rc; + return -1; } addr.sockaddr.sin_port = @@ -149,14 +145,14 @@ static inline int sap_create_and_listen (char *local_address, int doListen, if (sap >= 0) { int val = 1; setsockopt (sap, SOL_SOCKET, SO_REUSEADDR, (OPT_TYPE *)&val, sizeof (val)); - rc = bind (sap, (struct sockaddr *)&addr.sockaddr, sizeof (addr.sockaddr)); - if (rc < 0) { - return rc; + if (bind (sap, (struct sockaddr *)&addr.sockaddr, sizeof (addr.sockaddr)) < 0) { + VERBOSE (sap, ERROR, PRINTF ("cant bind on SAP %d\n", sap)); + return -1; } if (doListen) { - rc = listen (sap, 5); - if (rc < 0) { - return rc; + if (listen (sap, 5) < 0) { + VERBOSE (sap, ERROR, PRINTF ("cant listen on SAP %d\n", sap)); + return -1; } } } @@ -166,9 +162,8 @@ static inline int sap_create_and_listen (char *local_address, int doListen, if (sap >= 0) { int val = 1; setsockopt (sap, SOL_SOCKET, SO_REUSEADDR, (OPT_TYPE *)&val, sizeof (val)); - rc = bind (sap, (struct sockaddr *)&addr.sockaddr, sizeof (addr.sockaddr)); - if (rc < 0) { - return rc; + if (bind (sap, (struct sockaddr *)&addr.sockaddr, sizeof (addr.sockaddr)) < 0) { + VERBOSE (sap, ERROR, PRINTF ("cant bind on SAP %d\n", sap)); } } break; @@ -206,12 +201,12 @@ int SAP_Connect_Offset (char *local_address, char *remote_address, int port_offs SAP_addr_t addr; int sap; - int rc = parse_url (remote_address, &addr); - if (rc < 0) { + VERBOSE (sap, DEBUG, PRINTF ("SAP remote addr %s\n", remote_address)); + if (parse_url (remote_address, &addr) < 0) { VERBOSE (sap, ERROR, PRINTF ("can't parse url\n")); errno = EINVAL; - return rc; + return -1; } addr.sockaddr.sin_port = @@ -246,13 +241,15 @@ int SAP_Connect_Offset (char *local_address, char *remote_address, int port_offs } SETNOBLK (sap); - rc = connect (sap, (struct sockaddr *)&addr.sockaddr, sizeof (addr.sockaddr)); + if (connect (sap, (struct sockaddr *)&addr.sockaddr, sizeof (addr.sockaddr)) < 0) { + VERBOSE (sap, ERROR, PRINTF ("can't connect on soket %d\n", sap)); + return -1; + } if (addr.type == SAP_tcp) { int val = 1; - rc = setsockopt (sap, IPPROTO_TCP, TCP_NODELAY, (OPT_TYPE *)&val, sizeof (val)); - if (rc < 0) { - VERBOSE (sap, ERROR, PRINTF ("setsockopt/TCP_NODELAY\n")); + if (setsockopt (sap, IPPROTO_TCP, TCP_NODELAY, (OPT_TYPE *)&val, sizeof (val)) < 0) { + VERBOSE (sap, ERROR, PRINTF ("error on setsockopt/TCP_NODELAY\n")); return -1; } } @@ -260,6 +257,7 @@ int SAP_Connect_Offset (char *local_address, char *remote_address, int port_offs assert (SAP_list[sap] == NULL); SAP_list[sap] = (SAP_descriptor_t *) calloc (1, sizeof (SAP_descriptor_t)); assert (SAP_list[sap]); + if (__sync_bool_compare_and_swap (&__init, 1, 0)) { atexit (free_saps); } @@ -275,8 +273,8 @@ int SAP_IsConnected (int sap) int sockerr; socklen_t rlen = sizeof (sockerr); - int rc = getsockopt (sap, SOL_SOCKET, SO_ERROR, (OPT_TYPE *)&sockerr, &rlen); - if (rc < 0) { + if (getsockopt (sap, SOL_SOCKET, SO_ERROR, (OPT_TYPE *)&sockerr, &rlen) < 0) { + VERBOSE (sap, ERROR, PRINTF ("error on getsockopt\n")); return -1; } @@ -288,6 +286,7 @@ int SAP_IsConnected (int sap) return 0; break; } + return -1; } @@ -298,7 +297,7 @@ int SAP_Accept (int sap) int newsap = accept (sap, NULL, 0); if (newsap < 0) { - VERBOSE (sap, ERROR, PRINTF ("can't accept any SAP\n")); + VERBOSE (sap, ERROR, PRINTF ("can't accept SAP %d\n", sap)); return newsap; } if (newsap >= MAX_SAP_NUMBER) { @@ -306,19 +305,20 @@ int SAP_Accept (int sap) errno = ENOMEM; return -1; } - assert (SAP_list[newsap] == NULL); + assert (SAP_list[newsap] == NULL); SAP_list[newsap] = (SAP_descriptor_t *)calloc (1, sizeof (SAP_descriptor_t)); assert (SAP_list[newsap]); + if (__sync_bool_compare_and_swap (&__init, 1, 0)) { atexit (free_saps); } + SETNOBLK (newsap); int val = 1; - int rc = setsockopt (newsap, IPPROTO_TCP, TCP_NODELAY, (OPT_TYPE *)&val, sizeof (val)); - if (rc < 0) { - VERBOSE (sap, ERROR, PRINTF ("setsockopt/TCP_NODELAY\n")); + if (setsockopt (newsap, IPPROTO_TCP, TCP_NODELAY, (OPT_TYPE *)&val, sizeof (val)) < 0) { + VERBOSE (sap, ERROR, PRINTF ("error on setsockopt/TCP_NODELAY\n")); return -1; } @@ -342,11 +342,11 @@ void SAP_Close (int sap) if ((sap < 0) || (sap >= MAX_SAP_NUMBER)) { return; } + close (sap); - if (SAP_list[sap]) { - free (SAP_list[sap]); - SAP_list[sap] = NULL; - } + + free (SAP_list[sap]); + SAP_list[sap] = NULL; } void SAP_Set_Blocking (int sap) @@ -372,6 +372,8 @@ int SAP_Send (int sap, unsigned char *data, int len) return -1; } + VERBOSE (sap, TRACE, PRINTF ("SAP_Send writting...\n")); + return write (sap, data, len); } @@ -403,10 +405,12 @@ int SAP_Receive (int sap, unsigned char *buffer, int maxlen) return -1; } + VERBOSE (sap, TRACE, PRINTF ("SAP_Receive reading...\n")); + int rc = read (sap, buffer, maxlen); - if ((rc < 0) && (errno != EAGAIN)) { - rc = -1; + if ((rc < 0) && (errno == EAGAIN)) { + rc = 0; } return rc; diff --git a/sap_test.c b/sap_test.c index 781f5b1..a3e1f92 100644 --- a/sap_test.c +++ b/sap_test.c @@ -97,7 +97,7 @@ int test_client (char *local_address, char *remote_address) VERBOSE (sap, TRACE, PRINTF ("test_client\n")); int count; - unsigned char tx_data[10][8192]; + unsigned char tx_data[10][1500]; int tx_len[10]; VERBOSE (sap, DEBUG, PRINTF ("%s started\n", remote_address)); @@ -124,14 +124,15 @@ int test_client (char *local_address, char *remote_address) rc = SAP_Send (sap, tx_data[count], tx_len[count]); if (rc < 0) { - VERBOSE (sap, WARNING, PRINTF ("%s SAP_Send tx error\n", remote_address)); + VERBOSE (sap, WARNING, PRINTF ("%s SAP_Send tx error (%d/%d-%d)\n", remote_address, rc, tx_len[count], errno)); return -1; - } + if (tx_len[count] != rc) { VERBOSE (sap, WARNING, PRINTF ("%s SAP_Send tx len error tx=%d rc=%d\n", remote_address, tx_len[count], rc)); return -1; } + VERBOSE (sap, DEBUG, PRINTF ("%s SAP_Send ok (%d)\n", remote_address, tx_len[count])); } for (count = 0; count < 10; count++) { @@ -267,7 +268,7 @@ int main (int argc, char **argv) exit (1); } - printf ("*** STARTING TEST SEQUENCE ***\n"); + printf ("*** STARTING SERVERS ***\n"); pthread_t tcp_thread, udp_thread; @@ -276,6 +277,8 @@ int main (int argc, char **argv) /* Give some delay to server to setup there SAP */ sleep (1); + + printf ("*** STARTING TEST SEQUENCE ***\n"); pthread_t tcp_client_thread, udp_client_thread; -- 2.30.2