static void *run_ctos_loop(void *arg) { struct client_data *cdata = (struct client_data*)arg; int recv_len; int sent; char buffer[131072]; #ifdef WIN32 HANDLE stoc = NULL; #else pthread_t stoc; #endif printf("%s: fd = %d\n", __func__, cdata->fd); cdata->stop_stoc = 0; #ifdef WIN32 stoc = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)run_stoc_loop, cdata, 0, NULL); #else pthread_create(&stoc, NULL, run_stoc_loop, cdata); #endif while (!cdata->stop_ctos && cdata->fd>0 && cdata->sfd>0) { recv_len = socket_receive_timeout(cdata->fd, buffer, sizeof(buffer), 0, 5000); if (recv_len <= 0) { if (recv_len == 0) { // try again continue; } else { fprintf(stderr, "recv failed: %s\n", strerror(errno)); break; } } else { // send to local socket sent = socket_send(cdata->sfd, buffer, recv_len); if (sent < recv_len) { if (sent <= 0) { fprintf(stderr, "send failed: %s\n", strerror(errno)); break; } else { fprintf(stderr, "only sent %d from %d bytes\n", sent, recv_len); } } } } close(cdata->fd); cdata->fd = -1; cdata->stop_stoc = 1; #ifdef WIN32 WaitForSingleObject(stoc, INFINITE); #else pthread_join(stoc, NULL); #endif return NULL; }
static void *run_stoc_loop(void *arg) { struct client_data *cdata = (struct client_data*)arg; int recv_len; int sent; char buffer[131072]; printf("%s: fd = %d\n", __func__, cdata->fd); while (!cdata->stop_stoc && cdata->fd > 0 && cdata->sfd > 0) { recv_len = socket_receive_timeout(cdata->sfd, buffer, sizeof(buffer), 0, 5000); if (recv_len <= 0) { if (recv_len == 0) { // try again continue; } else { fprintf(stderr, "recv failed: %s\n", strerror(errno)); break; } } else { // send to socket sent = socket_send(cdata->fd, buffer, recv_len); if (sent < recv_len) { if (sent <= 0) { fprintf(stderr, "send failed: %s\n", strerror(errno)); break; } else { fprintf(stderr, "only sent %d from %d bytes\n", sent, recv_len); } } } } close(cdata->fd); cdata->fd = -1; cdata->stop_ctos = 1; return NULL; }
static void *thread_client_to_device(void *data) { socket_info_t* socket_info = (socket_info_t*)data; idevice_error_t res = IDEVICE_E_UNKNOWN_ERROR; int recv_len; int sent; char buffer[131072]; thread_t dtoc; debug("%s: started thread...\n", __func__); debug("%s: client_fd = %d\n", __func__, socket_info->client_fd); debug("%s: server_fd = %d\n", __func__, socket_info->server_fd); /* spawn server to client thread */ socket_info->stop_dtoc = 0; if (thread_create(&dtoc, thread_device_to_client, data) != 0) { fprintf(stderr, "Failed to start device to client thread...\n"); } while (!quit_flag && !socket_info->stop_ctod && socket_info->client_fd > 0 && socket_info->server_fd > 0) { debug("%s: receiving data from client...\n", __func__); /* attempt to read incoming data from client */ recv_len = socket_receive_timeout(socket_info->client_fd, buffer, sizeof(buffer), 0, 5000); /* any data received? */ if (recv_len <= 0) { if (recv_len == 0) { /* try again */ continue; } else { fprintf(stderr, "Receive failed: %s\n", strerror(errno)); break; } } else { /* forward data to device */ debug("%s: sending data to device...\n", __func__); res = idevice_connection_send(socket_info->device_connection, buffer, recv_len, (uint32_t*)&sent); if (sent < recv_len || res != IDEVICE_E_SUCCESS) { if (sent <= 0) { fprintf(stderr, "send failed: %s\n", strerror(errno)); break; } else { fprintf(stderr, "only sent %d from %d bytes\n", sent, recv_len); } } else { // sending succeeded, receive from device debug("%s: sent %d bytes to device\n", __func__, sent); } } } debug("%s: shutting down...\n", __func__); socket_shutdown(socket_info->client_fd, SHUT_RDWR); socket_close(socket_info->client_fd); socket_info->client_fd = -1; socket_info->stop_dtoc = 1; /* join other thread to allow it to stop */ thread_join(dtoc); return NULL; }