Changes in uspace/srv/net/app/echo/echo.c [3be62bc:aadf01e] in mainline
- File:
-
- 1 edited
-
uspace/srv/net/app/echo/echo.c (modified) (23 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/app/echo/echo.c
r3be62bc raadf01e 55 55 #define NAME "Echo" 56 56 57 /** Prints the application help.58 */59 void echo_print_help(void);60 61 57 /** Module entry point. 62 58 * Reads command line parameters and starts listenning. … … 66 62 */ 67 63 int main(int argc, char * argv[]); 64 65 /** Prints the application help. 66 */ 67 void echo_print_help(void); 68 69 /** Translates the character string to the protocol family number. 70 * @param[in] name The protocol family name. 71 * @returns The corresponding protocol family number. 72 * @returns EPFNOSUPPORTED if the protocol family is not supported. 73 */ 74 int echo_parse_protocol_family(const char * name); 75 76 /** Translates the character string to the socket type number. 77 * @param[in] name The socket type name. 78 * @returns The corresponding socket type number. 79 * @returns ESOCKNOSUPPORTED if the socket type is not supported. 80 */ 81 int echo_parse_socket_type(const char * name); 68 82 69 83 void echo_print_help(void){ … … 101 115 } 102 116 117 int echo_parse_protocol_family(const char * name){ 118 if(str_lcmp(name, "PF_INET", 7) == 0){ 119 return PF_INET; 120 }else if(str_lcmp(name, "PF_INET6", 8) == 0){ 121 return PF_INET6; 122 } 123 return EPFNOSUPPORT; 124 } 125 126 int echo_parse_socket_type(const char * name){ 127 if(str_lcmp(name, "SOCK_DGRAM", 11) == 0){ 128 return SOCK_DGRAM; 129 }else if(str_lcmp(name, "SOCK_STREAM", 12) == 0){ 130 return SOCK_STREAM; 131 } 132 return ESOCKTNOSUPPORT; 133 } 134 103 135 int main(int argc, char * argv[]){ 104 136 ERROR_DECLARE; … … 106 138 size_t size = 1024; 107 139 int verbose = 0; 108 char * reply = NULL;109 sock_type_t type = SOCK_DGRAM;140 char * reply = NULL; 141 sock_type_t type = SOCK_DGRAM; 110 142 int count = -1; 111 143 int family = PF_INET; 112 uint16_t port = 7;144 uint16_t port = 7; 113 145 int backlog = 3; 114 146 115 socklen_t max_length = sizeof(struct sockaddr_in6);147 socklen_t max_length = sizeof(struct sockaddr_in6); 116 148 uint8_t address_data[max_length]; 117 struct sockaddr * address = (struct sockaddr *) address_data;149 struct sockaddr * address = (struct sockaddr *) address_data; 118 150 struct sockaddr_in * address_in = (struct sockaddr_in *) address; 119 151 struct sockaddr_in6 * address_in6 = (struct sockaddr_in6 *) address; … … 123 155 int socket_id; 124 156 int listening_id; 125 char * data;157 char * data; 126 158 size_t length; 127 159 int index; … … 129 161 int value; 130 162 131 // print the program label132 163 printf("Task %d - ", task_get_id()); 133 164 printf("%s\n", NAME); 134 165 135 // parse the command line arguments136 166 for(index = 1; index < argc; ++ index){ 137 167 if(argv[index][0] == '-'){ … … 144 174 break; 145 175 case 'f': 146 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "protocol family", 0, parse_protocol_family));176 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "protocol family", 0, echo_parse_protocol_family)); 147 177 break; 148 178 case 'h': … … 162 192 break; 163 193 case 't': 164 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &value, "socket type", 0, parse_socket_type));194 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &value, "socket type", 0, echo_parse_socket_type)); 165 195 type = (sock_type_t) value; 166 196 break; … … 168 198 verbose = 1; 169 199 break; 170 // long options with the double minus sign ('-')171 200 case '-': 172 201 if(str_lcmp(argv[index] + 2, "backlog=", 6) == 0){ … … 175 204 ERROR_PROPAGATE(parse_parameter_int(argc, argv, &index, &count, "message count", 8)); 176 205 }else if(str_lcmp(argv[index] + 2, "family=", 7) == 0){ 177 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "protocol family", 9, parse_protocol_family));206 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &family, "protocol family", 9, echo_parse_protocol_family)); 178 207 }else if(str_lcmp(argv[index] + 2, "help", 5) == 0){ 179 208 echo_print_help(); … … 188 217 size = (value >= 0) ? (size_t) value : 0; 189 218 }else if(str_lcmp(argv[index] + 2, "type=", 5) == 0){ 190 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &value, "socket type", 7, parse_socket_type));219 ERROR_PROPAGATE(parse_parameter_name_int(argc, argv, &index, &value, "socket type", 7, echo_parse_socket_type)); 191 220 type = (sock_type_t) value; 192 221 }else if(str_lcmp(argv[index] + 2, "verbose", 8) == 0){ … … 210 239 } 211 240 212 // check the buffer size213 241 if(size <= 0){ 214 242 fprintf(stderr, "Receive size too small (%d). Using 1024 bytes instead.\n", size); 215 243 size = 1024; 216 244 } 217 // size plus t he terminating null (\0)245 // size plus terminating null (\0) 218 246 data = (char *) malloc(size + 1); 219 247 if(! data){ … … 222 250 } 223 251 224 // set the reply size if set225 252 reply_length = reply ? str_length(reply) : 0; 226 253 227 // prepare the address buffer 254 listening_id = socket(family, type, 0); 255 if(listening_id < 0){ 256 socket_print_error(stderr, listening_id, "Socket create: ", "\n"); 257 return listening_id; 258 } 259 228 260 bzero(address_data, max_length); 229 261 switch(family){ … … 243 275 } 244 276 245 // get a listening socket246 277 listening_id = socket(family, type, 0); 247 278 if(listening_id < 0){ … … 250 281 } 251 282 252 // if the stream socket is used253 283 if(type == SOCK_STREAM){ 254 // check the backlog255 284 if(backlog <= 0){ 256 285 fprintf(stderr, "Accepted sockets queue size too small (%d). Using 3 instead.\n", size); 257 286 backlog = 3; 258 287 } 259 // set the backlog260 288 if(ERROR_OCCURRED(listen(listening_id, backlog))){ 261 289 socket_print_error(stderr, ERROR_CODE, "Socket listen: ", "\n"); … … 264 292 } 265 293 266 // bind the listenning socket267 294 if(ERROR_OCCURRED(bind(listening_id, address, addrlen))){ 268 295 socket_print_error(stderr, ERROR_CODE, "Socket bind: ", "\n"); … … 276 303 socket_id = listening_id; 277 304 278 // do count times279 // or indefinitely if set to a negative value280 305 while(count){ 281 282 306 addrlen = max_length; 283 307 if(type == SOCK_STREAM){ 284 // acceept a socket if the stream socket is used285 308 socket_id = accept(listening_id, address, &addrlen); 286 309 if(socket_id <= 0){ … … 292 315 } 293 316 } 294 295 // if the datagram socket is used or the stream socked was accepted296 317 if(socket_id > 0){ 297 298 // receive an echo request299 318 value = recvfrom(socket_id, data, size, 0, address, &addrlen); 300 319 if(value < 0){ … … 303 322 length = (size_t) value; 304 323 if(verbose){ 305 // print the header306 307 // get the source port and prepare the address buffer308 324 address_start = NULL; 309 325 switch(address->sa_family){ … … 319 335 fprintf(stderr, "Address family %d (0x%X) is not supported.\n", address->sa_family); 320 336 } 321 // parse the source address322 337 if(address_start){ 323 338 if(ERROR_OCCURRED(inet_ntop(address->sa_family, address_start, address_string, sizeof(address_string)))){ … … 329 344 } 330 345 } 331 332 // answer the request either with the static reply or the original data333 346 if(ERROR_OCCURRED(sendto(socket_id, reply ? reply : data, reply ? reply_length : length, 0, address, addrlen))){ 334 347 socket_print_error(stderr, ERROR_CODE, "Socket send: ", "\n"); 335 348 } 336 337 } 338 339 // close the accepted stream socket 349 } 340 350 if(type == SOCK_STREAM){ 341 351 if(ERROR_OCCURRED(closesocket(socket_id))){ … … 343 353 } 344 354 } 345 346 } 347 348 // decrease the count if positive 355 } 349 356 if(count > 0){ 350 357 -- count; … … 359 366 } 360 367 361 // close the listenning socket362 368 if(ERROR_OCCURRED(closesocket(listening_id))){ 363 369 socket_print_error(stderr, ERROR_CODE, "Close socket: ", "\n");
Note:
See TracChangeset
for help on using the changeset viewer.
