diff options
author | Felix Weinrank <weinrank@fh-muenster.de> | 2020-02-03 09:22:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-03 09:22:34 +0100 |
commit | 09a28469e69e89b7a9e81cf5fffabe0b12a1084d (patch) | |
tree | abc43a70dc38ecefabe50bf6b3908a9169f45077 /programs | |
parent | bee946a606752a443bd70bca1cb296527fed706d (diff) | |
download | usrsctp-09a28469e69e89b7a9e81cf5fffabe0b12a1084d.tar.gz |
Handle usrsctp_sendv EWOULDBLOCK (#424)
Diffstat (limited to 'programs')
-rw-r--r-- | programs/ekr_loop.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/programs/ekr_loop.c b/programs/ekr_loop.c index d198beda..dfb84b56 100644 --- a/programs/ekr_loop.c +++ b/programs/ekr_loop.c @@ -274,7 +274,7 @@ main(int argc, char *argv[]) #else pthread_t tid_c, tid_s; #endif - int i, j, cur_buf_size, snd_buf_size, rcv_buf_size; + int i, j, cur_buf_size, snd_buf_size, rcv_buf_size, sendv_retries_left; socklen_t opt_len; struct sctp_sndinfo sndinfo; char *line; @@ -491,6 +491,8 @@ main(int argc, char *argv[]) sndinfo.snd_context = 0; sndinfo.snd_assoc_id = 0; + + for (i = 0; i < NUMBER_OF_STEPS; i++) { j = 0; if (i % 2) { @@ -499,25 +501,37 @@ main(int argc, char *argv[]) sndinfo.snd_flags = 0; } /* Send a 1 MB message */ + sendv_retries_left = 120; debug_printf("usrscp_sendv - step %d - call %d flags %x\n", i, ++j, sndinfo.snd_flags); - if (usrsctp_sendv(s_c, line, LINE_LENGTH, NULL, 0, (void *)&sndinfo, + while (usrsctp_sendv(s_c, line, LINE_LENGTH, NULL, 0, (void *)&sndinfo, (socklen_t)sizeof(struct sctp_sndinfo), SCTP_SENDV_SNDINFO, 0) < 0) { - perror("usrsctp_sendv"); - exit(EXIT_FAILURE); + fprintf(stderr,"usrsctp_sendv - errno: %d - %s\n", errno, strerror(errno)); + if (errno != EWOULDBLOCK || !sendv_retries_left) { + exit(EXIT_FAILURE); + } + sendv_retries_left--; +#ifdef _WIN32 + Sleep(1000); +#else + sleep(1); +#endif } /* Send a 1 MB message */ + sendv_retries_left = 120; debug_printf("usrscp_sendv - step %d - call %d flags %x\n", i, ++j, sndinfo.snd_flags); - if (usrsctp_sendv(s_c, line, LINE_LENGTH, NULL, 0, (void *)&sndinfo, + while (usrsctp_sendv(s_c, line, LINE_LENGTH, NULL, 0, (void *)&sndinfo, (socklen_t)sizeof(struct sctp_sndinfo), SCTP_SENDV_SNDINFO, 0) < 0) { - perror("usrsctp_sendv"); - exit(EXIT_FAILURE); - } - debug_printf("Sending done, sleeping\n"); + if (errno != EWOULDBLOCK || !sendv_retries_left) { + fprintf(stderr,"usrsctp_sendv - errno: %d - %s\n", errno, strerror(errno)); + } + sendv_retries_left--; #ifdef _WIN32 - Sleep(10000); + Sleep(1000); #else - sleep(10); + sleep(1); #endif + } + debug_printf("Sending done, sleeping\n"); } free(line); usrsctp_shutdown(s_c, SHUT_WR); |