int tc_message_init(tc_event_loop_t *event_loop, uint32_t ip, uint16_t port) { int fd; tc_event_t *ev; #if (TCPCOPY_DR) socklen_t len; struct timeval timeout = {3,0}; #endif if ((fd = tc_socket_init()) == TC_INVALID_SOCKET) { return TC_INVALID_SOCKET; } if (tc_socket_connect(fd, ip, port) == TC_ERROR) { return TC_INVALID_SOCKET; } if (tc_socket_set_nodelay(fd) == TC_ERROR) { return TC_INVALID_SOCKET; } #if (TCPCOPY_COMBINED) if (tc_socket_set_nonblocking(fd) == TC_ERROR) { return TC_INVALID_SOCKET; } #endif #if (TCPCOPY_DR) len = (socklen_t) sizeof(struct timeval); setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, len); #endif ev = tc_event_create(fd, tc_process_server_msg, NULL); if (ev == NULL) { return TC_INVALID_SOCKET; } if (tc_event_add(event_loop, ev, TC_EVENT_READ) == TC_EVENT_ERROR) { return TC_INVALID_SOCKET; } return fd; }
/* This is for copying multiple ports */ int address_add_msg_conn(tc_event_loop_t *event_loop, uint16_t local_port, uint32_t dst_ip, uint16_t dst_port) { int fd; tc_event_t *msg_socket_event; if ((fd = tc_socket_init()) == TC_INVALID_SOCKET) { return TC_ERROR; } if (tc_socket_connect(fd, dst_ip, dst_port) == TC_ERROR) { return TC_ERROR; } if (tc_socket_set_nodelay(fd) == TC_ERROR) { return TC_ERROR; } msg_socket_event = tc_event_create(fd, dispose_event_wrapper, NULL); if (msg_socket_event == NULL) { return TC_ERROR; } if (tc_event_add(event_loop, msg_socket_event, TC_EVENT_READ) == TC_EVENT_ERROR) { return TC_ERROR; } addr[local_port].ip = dst_ip; addr[local_port].port = dst_port; addr[local_port].sock = fd; return TC_OK; }