/** * @brief Instanciates and starts all listeners thread (chat, online players). * @pre The client have to be connected before to call this function. */ void MainWindow::startListeners() { // Start a thread for listening server requests. _listener = new Listener(_player.socket, this); connect(_listener, SIGNAL(pseudoAlreadyExists(QString)), this, SLOT(pseudoAlreadyExists(QString))); connect(_listener, SIGNAL(addMsg(QString)), this, SLOT(addMsg(QString))); connect(_listener, SIGNAL(addPlayerToView(player)), this, SIGNAL(askAddPlayer(player))); connect(_listener, SIGNAL(removePlayerFromView(player)), this, SIGNAL(askRmPlayer(player))); connect(_listener, SIGNAL(advisePlayerForGame(QString)), this, SLOT(adviseForGame(QString))); connect(_listener, SIGNAL(advisePlayerForAbortedGame(QString)), this, SLOT(adviseForAbortedGame(QString))); connect(_listener, SIGNAL(startGame()), this, SLOT(startGame())); connect(_listener, SIGNAL(clientBusy(player)), ui->rightMenuWidget, SIGNAL(askSetBusy(player))); connect(_listener, SIGNAL(clientFree(player)), ui->rightMenuWidget, SIGNAL(askSetFree(player))); connect(_listener, SIGNAL(setOpponent(player)), this, SLOT(setOpponent(player))); connect(_listener, SIGNAL(opponentQuit(player)), this, SLOT(opponentQuit(player))); connect(_listener, SIGNAL(receiveCheckerboard(checkerboard)), ui->checkerboardwidget, SLOT(receiveCheckerboard(checkerboard))); connect(_listener, SIGNAL(receiveWinner(player)), this, SLOT(displayWinner(player))); }
void acceptClients(serv *server){ int socket = server->socket; struct sockaddr_in clientAddr; int clientSocket; pthread_attr_t worker_attr; pthread_attr_init(&worker_attr); pthread_attr_setdetachstate(&worker_attr, PTHREAD_CREATE_DETACHED); pthread_t worker_thread; socklen_t sinSizeClient = sizeof(struct sockaddr_in); /*the accept loop*/ while(1){ if((clientSocket = accept(socket, (struct sockaddr *) &clientAddr, &sinSizeClient)) < 0){ perror("ERROR: Could not accept client"); continue; } /*resolve the clients host name*/ bstring clientHostName = safe_BfromCstr(""); int rc = getnameinfo((struct sockaddr *) &clientAddr, sinSizeClient, charBuffromBstr(clientHostName), IRC_MAX_LEN+1, NULL, 0, 0); clientHostName->slen = strlen(charBuffromBstr(clientHostName)); if (rc != 0 || !clientHostName->slen){ bdestroy(clientHostName); clientHostName = safe_BfromCstr("unresolved"); } /*init the client*/ cli *newClient = initClient(clientSocket, clientHostName, server); /*create thread to wait for the client to register and then handle client request*/ if (pthread_create(&worker_thread, &worker_attr, &enterRegister, newClient) != 0){ clientFree(newClient); close(socket); errnoExit("ERROR: Could not create thread"); } } /*free server*/ serverFree(server); }
/////////////////////////////////////////////////////////////////////////////// // Main function int main(int argc, char **argv) {WSADATA wsd; SOCKET sClient; struct sockaddr_in local, client; int iAddrSize; char fileName[_MAX_PATH + 1]; char *pFN, *pc; // create the prefix and suffix for the shared memories names strcpy(gPreSM, "CWSL"); strcpy(gPostSM, "Band"); ::GetModuleFileName(NULL, fileName, _MAX_PATH); #define BASE_FNAME "CWSL_Net" pFN = strstr(fileName, BASE_FNAME); if (pFN != NULL) { pFN += strlen(BASE_FNAME); for (pc = pFN; (*pc != '\0') && (*pc != '.'); pc++); *pc = '\0'; strcat(gPostSM, pFN); } // print info printf("Starting (%s#%s) ...\n", gPreSM, gPostSM); // initialize slots clientInit(); // initialize sockets if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {printf("Failed to load Winsock!\n"); return 1; } // create our listening socket sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (sListen == SOCKET_ERROR) {printf("socket() failed: %d\n", WSAGetLastError()); return 1;} // bind it to our well-known port local.sin_addr.s_addr = htonl(INADDR_ANY); local.sin_family = AF_INET; local.sin_port = htons(LISTEN_PORT); if (bind(sListen, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR) {printf("bind() failed: %d\n", WSAGetLastError()); return 1;} // set socket into listen mode listen(sListen, 8); // register console control handler if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)ControlHandler, TRUE)) printf("Can't register console control handler!\n"); // print info printf("Started\n"); // main loop while (1) {// perform a blocking accept() call iAddrSize = sizeof(client); sClient = accept(sListen, (struct sockaddr *)&client, &iAddrSize); if (sClient == INVALID_SOCKET) {printf("accept() failed: %d\n", WSAGetLastError()); break;} // create new client thread if (!clientNew(&client, sClient)) printf("clientNew() failed: %d\n", GetLastError()); } // print info printf("Stopping ...\n"); // close listen socket closesocket(sListen); // free all clients clientFree(); // cleanup sockets WSACleanup(); // print info printf("Stopped\n"); // that't all return 0; }