void Start_Visualizer(Socket_with_Event *arg) { //recv an id DWORD dwID = 0; DWORD dwForeignProcID = 0; //Get the node's identifier while (SOCKET_ERROR == recv(arg->sock, (char*)&dwID, sizeof(DWORD), 0)) { int error; char msg[256]; error = WSAGetLastError(); if (error == WSAEWOULDBLOCK) { Sleep(0); continue; } translate_WSAErrorCode(error, msg); fdebug2("Socket Error dwID: %i, %s\n", error, msg); closesocket(arg->sock); WSACloseEvent(arg->sock_event); delete arg; ExitThread(0); } //get the foreign ProcID while (SOCKET_ERROR == recv(arg->sock, (char*)&dwForeignProcID, sizeof(DWORD), 0)) { int error; char msg[256]; error = WSAGetLastError(); if (error == WSAEWOULDBLOCK) { Sleep(0); continue; } translate_WSAErrorCode(error, msg); fdebug2("Socket Error dwID: %i, %s\n", error, msg); closesocket(arg->sock); WSACloseEvent(arg->sock_event); delete arg; ExitThread(0); } //get the right to read the list WaitForSingleObject(insert_mutex, INFINITE); // find the application MPI_Node *iter_node = mpi_list, *node = NULL; while (iter_node != NULL) { if (iter_node->id == dwID) { node = iter_node; break; } iter_node = iter_node->next; } //send over the list if (node) { while (SOCKET_ERROR == send(arg->sock, (char *)&node->nproc, sizeof(node->nproc), 0)) { int error; char msg[256]; error = WSAGetLastError(); if (error == WSAEWOULDBLOCK) { Sleep(0); continue; } translate_WSAErrorCode(error, msg); fdebug2("Socket Error dwID: %i, %s\n", error, msg); closesocket(arg->sock); WSACloseEvent(arg->sock_event); delete arg; ExitThread(0); } for (int i = 0; i < node->nproc; ++i) { WSAPROTOCOL_INFO ProtocolInfo; if (SOCKET_ERROR == WSADuplicateSocket(node->sockets[i], dwForeignProcID, &ProtocolInfo)) { fdebug("Error in Duplicating the Socket\n"); int error = WSAGetLastError(); char msg[256]; translate_WSAErrorCode(error, msg); fdebug2("Socket Error dwID: %i, %s\n", error, msg); } while (SOCKET_ERROR == send(arg->sock, (char *)&ProtocolInfo, sizeof(WSAPROTOCOL_INFO), 0)) { int error; char msg[256]; error = WSAGetLastError(); if (error == WSAEWOULDBLOCK) { Sleep(0); continue; } translate_WSAErrorCode(error, msg); fdebug2("Socket Error dwID: %i, %s\n", error, msg); closesocket(arg->sock); WSACloseEvent(arg->sock_event); delete arg; ExitThread(0); } } } else { dwID =0; send(arg->sock, (char *)&dwID, sizeof(dwID), 0); } ReleaseMutex(insert_mutex); }