@@ -16,10 +16,10 @@ int main(int argc, char* argv[])
16
16
{
17
17
18
18
struct sockaddr_in servaddr = {0 };
19
- struct sockaddr_in laddr = {0 };
20
- int sockfd , in , flags ;
21
- char * saddr ;
22
- int sport , lport , error = 0 , secs = 0 ;
19
+ struct sockaddr_in laddr [ 10 ] = {0 };
20
+ int sockfd , in , flags , count = 1 ;
21
+ char * saddr , * laddrs , * addr ;
22
+ int sport , lport , error = 0 , secs = 0 , i = 0 ;
23
23
struct sctp_status status = {0 };
24
24
struct sctp_sndrcvinfo sndrcvinfo = {0 };
25
25
struct sctp_event_subscribe events = {0 };
@@ -29,13 +29,35 @@ int main(int argc, char* argv[])
29
29
socklen_t opt_len ;
30
30
socklen_t slen = (socklen_t ) sizeof (struct sockaddr_in );
31
31
32
-
32
+ if (argc < 5 ) {
33
+ printf ("Usage: %s localaddr1<,localaddr2..> localport serverIP serverport <delay> <count>\n" , argv [0 ]);
34
+ exit (1 );
35
+ }
33
36
sockfd = socket (AF_INET , SOCK_STREAM , IPPROTO_SCTP );
34
37
lport = atoi (argv [2 ]);
35
-
36
- laddr .sin_family = AF_INET ;
37
- laddr .sin_addr .s_addr = inet_addr (argv [1 ]);
38
- laddr .sin_port = lport ?htons (lport ):0 ;
38
+ laddrs = argv [1 ];
39
+ memset (laddr , 0 , sizeof (laddr ));
40
+ if (strstr (laddrs , "," )) {
41
+ i = 0 ;
42
+ addr = strtok (laddrs , ",\n" );
43
+ laddr [0 ].sin_family = AF_INET ;
44
+ laddr [0 ].sin_port = lport ?htons (lport ):0 ;
45
+ laddr [0 ].sin_addr .s_addr = inet_addr (addr );
46
+ //printf("%s\n", addr);
47
+ addr = strtok (NULL , ",\n" );
48
+ while (addr != NULL ) {
49
+ i ++ ;
50
+ //printf("%s\n", addr);
51
+ laddr [i ].sin_family = AF_INET ;
52
+ laddr [i ].sin_port = lport ?htons (lport ):0 ;
53
+ laddr [i ].sin_addr .s_addr = inet_addr (addr );
54
+ addr = strtok (NULL , ",\n" );
55
+ }
56
+ } else {
57
+ laddr [0 ].sin_family = AF_INET ;
58
+ laddr [0 ].sin_addr .s_addr = inet_addr (argv [1 ]);
59
+ laddr [0 ].sin_port = lport ?htons (lport ):0 ;
60
+ }
39
61
40
62
//bind to local address
41
63
error = bind (sockfd , (struct sockaddr * )& laddr , sizeof (struct sockaddr_in ));
@@ -45,15 +67,31 @@ int main(int argc, char* argv[])
45
67
exit (1 );
46
68
}
47
69
70
+ int j = 1 ;
71
+ while (j <= i ) {
72
+ error = sctp_bindx (sockfd ,(struct sockaddr * ) & laddr [j ], j , SCTP_BINDX_ADD_ADDR );
73
+ if (error != 0 ) {
74
+ printf ("\n\n\t\t***r: error adding addrs:"
75
+ " %s. ***\n" , strerror (errno ));
76
+ exit (1 );
77
+ } else {
78
+ //printf("Bind OK\n");
79
+ }
80
+ j ++ ;
81
+ }
82
+
48
83
//set the association options
49
84
initmsg .sinit_num_ostreams = 1 ;
50
85
setsockopt ( sockfd , IPPROTO_SCTP , SCTP_INITMSG , & initmsg ,sizeof (initmsg ));
51
86
52
87
saddr = argv [3 ];
53
88
sport = atoi (argv [4 ]);
54
- if (argv [ 5 ] ) {
89
+ if (argc >= 6 ) { /* Delay before exit */
55
90
secs = atoi (argv [5 ]);
56
91
}
92
+ if (argc == 7 ) { /* count for sending 1pps*/
93
+ count = atoi (argv [6 ]);
94
+ }
57
95
bzero ( (void * )& servaddr , sizeof (servaddr ) );
58
96
servaddr .sin_family = AF_INET ;
59
97
servaddr .sin_port = htons (sport );
@@ -65,11 +103,25 @@ int main(int argc, char* argv[])
65
103
opt_len = (socklen_t ) sizeof (struct sctp_status );
66
104
getsockopt (sockfd , IPPROTO_SCTP , SCTP_STATUS , & status , & opt_len );
67
105
68
- while (1 )
106
+ fd_set fds ; // will be checked for being ready to read
107
+ FD_ZERO (& fds );
108
+ FD_SET (sockfd , & fds );
109
+ struct timeval tv = { 0 };
110
+ tv .tv_sec = 1 ;
111
+ tv .tv_usec = 0 ;
112
+
113
+ while (count )
69
114
{
70
115
strncpy (msg , "hello" , strlen ("hello" ));
71
- //printf("Sending msg to server: %s", msg);
72
116
sctp_sendmsg (sockfd , (const void * )msg , strlen (msg ), NULL , 0 ,htonl (PPID ), 0 , 0 , 0 , 0 );
117
+ //printf("Sending msg to server: %s", msg);
118
+ //
119
+ int ret = select ( sockfd + 1 , & fds , NULL , NULL , & tv );
120
+ if (ret <= 0 ) {
121
+ printf ("Timeout\n" );
122
+ count -- ;
123
+ sleep (1 );
124
+ } else if (FD_ISSET ( sockfd , & fds )) {
73
125
74
126
in = sctp_recvmsg (sockfd , (void * )buff , RECVBUFSIZE ,
75
127
(struct sockaddr * )& servaddr ,
@@ -79,7 +131,17 @@ int main(int argc, char* argv[])
79
131
buff [in ] = 0 ;
80
132
printf ("%s" ,buff );
81
133
fflush (stdout );
82
- break ;
134
+ count -- ;
135
+ if (!count )
136
+ break ;
137
+ else {
138
+ printf ("\n" );
139
+ fflush (stdout );
140
+ sleep (1 );
141
+ }
142
+ }
143
+ } else {
144
+ break ;
83
145
}
84
146
}
85
147
if (secs ) sleep (secs );
0 commit comments