void connect_call_handler(unsigned long long uniqueSockID, int threads, unsigned char *buf, ssize_t len) { int index; socklen_t addrlen; struct sockaddr_in *addr; u_char *pt; pt = buf; addrlen = *(int *) pt; pt += sizeof(int); if (addrlen <= 0) { PRINT_DEBUG("READING ERROR! CRASH, addrlen=%d", addrlen); nack_send(uniqueSockID, connect_call); return; } addr = (struct sockaddr_in *) malloc(addrlen); memcpy(addr, pt, addrlen); pt += addrlen; if (pt - buf != len) { PRINT_DEBUG("READING ERROR! CRASH, diff=%d len=%d", pt - buf, len); nack_send(uniqueSockID, connect_call); return; } PRINT_DEBUG("%d,%d,%d", (addr->sin_addr).s_addr, ntohs(addr->sin_port), addr->sin_family); index = findjinniSocket(uniqueSockID); /** if that requested socket does not exist !! * this means we can not even talk to the requester FINS crash as a response!! */ if (index == -1) { PRINT_DEBUG( " CRASH !socket descriptor not found into jinni sockets! Bind failed on Jinni Side "); nack_send(uniqueSockID, connect_call); return; } if (jinniSockets[index].type == SOCK_DGRAM) { connect_udp(uniqueSockID, addr); } else if (jinniSockets[index].type == SOCK_STREAM) { connect_tcp(uniqueSockID, addr); } else { PRINT_DEBUG("This socket is of unknown type"); nack_send(uniqueSockID, connect_call); } return; }
void connect_output(OUTPUT *o) { struct sockaddr_in sock; sock.sin_family = AF_INET; sock.sin_port = htons(o->out_port); sock.sin_addr = o->out_host; o->out_sock = connect_udp(sock); if (o->out_sock > -1) { //LOGf("OUTPUT: Connected out_fd: %i | Output: udp://%s:%d\n", o->out_sock, inet_ntoa(o->out_host), o->out_port); } else { LOGf("ERROR: Can't connect output | Output: udp://%s:%d\n", inet_ntoa(o->out_host), o->out_port); exit(1); } }
static int start_server(struct server *s) { WSADATA wsadata; WSAStartup(MAKEWORD(2,2), &wsadata); s->udp_port = connect_udp(s->sd); if(s->udp_port < 0) { fprintf(stderr, "Failed to open UDP port\n"); return -1; } init_file_info(&s->finfo); if(pthread_create(&s->tid, NULL, &message_thread, s) < 0) { perror("pthread_create"); close(s->sd[0]); close(s->sd[1]); return -1; } return 0; }
int main(int argc, char **argv) { struct udp_state *ud; struct katcp_dispatch *d; unsigned int result; struct timeval now; fd_set fsr; char *ip_addr = NULL; uint32_t address, length; int i, j, c, pos; int wait, nooftries; int port = 0; int rw_flag = 0; i = j = 1; pos = 0; wait = 0; nooftries = 10; while (i < argc) { if (argv[i][0] == '-') { c = argv[i][j]; switch (c) { case '\0': j = 1; i++; break; case '-' : j++; break; case 'h' : fprintf(stderr, "usage: %s -R [-i ipaddress] [-p port] address length\n", argv[0]); return 0; break; case 'i' : j++; if(argv[i][j] == '\0'){ j = 0; i++; } if(i >= argc){ fprintf(stderr, "%s: option -%c requires a parameter\n", argv[0], c); } ip_addr = argv[i] + j; i++; j = 1; break; case 'p' : j++; if(argv[i][j] == '\0'){ j = 0; i++; } if(i >= argc){ fprintf(stderr, "%s: option -%c requires a parameter\n", argv[0], c); } port = atoi(argv[i] + j); #if DEBUG fprintf(stderr, "port number is %d\n", port); #endif i++; j = 1; break; case 'R' : rw_flag = 1; i++; break; default: fprintf(stderr, "%s: unknown option -%c\n", argv[0], argv[i][j]); return 2; } } else { pos = i; i = argc; } } d = setup_katcp(STDOUT_FILENO); if(d == NULL){ fprintf(stderr, "setup katcp failed\n"); return EX_OSERR; } ud = create_udp(d); if(ud == NULL){ fprintf(stderr, "create udp failed\n"); log_message_katcp(d, KATCP_LEVEL_ERROR, DMON_MODULE_NAME, "unable to allocate local udp state"); write_katcp(d); return EX_OSERR; } #if 0 if(connect_udp(d, ud, port) < 0){ fprintf(stderr, "connect udp failed\n"); log_message_katcp(d, KATCP_LEVEL_ERROR, DMON_MODULE_NAME, "unable to bind udp"); return EX_OSERR; } #endif ud->u_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(ud->u_fd < 0){ fprintf(stderr, "unable to create udp socket:\n "); log_message_katcp(d, KATCP_LEVEL_ERROR, DMON_MODULE_NAME, "unable to create udp socket: %s", strerror(errno)); return -1; } ud->u_rw = rw_flag; for(;;){ FD_ZERO(&fsr); FD_SET(ud->u_fd, &fsr); address = strtol(argv[pos], NULL, 16); length = strtol(argv[pos + 1], NULL, 16); #if DEBUG printf("pos:%d, address[%x] and length[%x]\n", pos, address, length); #endif send_udp(d, ud, ip_addr, port, address, length); now.tv_sec = 10; now.tv_usec = 0; result = select(ud->u_fd + 1, &fsr, NULL, NULL, &now); if(result == 0){ /* Resend again after timeout */ printf("Resending udp again\n"); send_udp(d, ud, ip_addr, port, address, length); } for(wait = 0; wait < nooftries; wait++){ if(FD_ISSET(ud->u_fd, &fsr)){ result = rcv_udp(d, ud); if(!result){ return EX_OK; } } } return EX_OSERR; } destroy_udp(d, ud); shutdown_katcp(d); return EX_OK; }