void MainWindow::runServer() { this->setWindowTitle("Player1"); server = new QTcpServer(this); if(!server->listen(QHostAddress::Any, 5555)) { ui->statusBar->showMessage("Unable to start game server."); return; } ui->connectBox->setEnabled(FALSE); ui->statusBar->showMessage("Game Server running. Waiting for other player..."); ui->gameBox->setEnabled(TRUE); ui->playButton->setEnabled(FALSE); isserver = TRUE; connect(server, SIGNAL(newConnection()), this, SLOT(connectToClient())); }
void *sendOneUpdateToAllClient(void *msg) { clntData_t *reqMsg = NULL; reqMsg = (clntData_t*)msg; if(reqMsg == NULL) { LOG_ERROR("Msg is NULL"); return; } char i =0; int sockFd = 0; CLIENT_DB *cdb = getClientDbInstance(); if(!cdb) { LOG_ERROR("Error in client db instance"); return; } for(i=0; i<MAX_CLIENT; i++) { // skip current client and unregistered client if(cdb->clientState[i] == clnt_unregister_state) continue; if((i == reqMsg->header.clntId) && (reqMsg->header.msgId != client_currentPlaying_m)) continue; if(connectToClient(i, &sockFd) != G_OK) { LOG_ERROR("Unable to connect with client for sending update"); cdb->deregisterClient(cdb,i); continue; } if(sendOneUpdate(reqMsg, sockFd) != G_OK) { LOG_ERROR("Sending update all fail"); } closeSocket(sockFd); } if(reqMsg->payLoad != NULL) free(reqMsg->payLoad); free(reqMsg); }
//Select transport based on profile and opts and set default GUID int MF_BaseSocketManager::openRequest(MF_APIOpen *event){ MF_Log::mf_log(MF_DEBUG, "MF_BaseSocketManager:open request analyzing request profile=%s guid=%d", event->getProfile(), event->getSrcGUID()); if(!strcmp("basic", event->getProfile())){ type = 1; } else{ MF_Log::mf_log(MF_ERROR, "MF_BaseSocketManager:openRequest wrong profile request %s", event->getProfile()); openReplyError(STACK_ACTION_FAILURE); return -1; } //Create transport if (transSetting.isReliabTrans) { trnsp = new MF_ReliabTransport(ID, &recvBuffer, &sendBuffer, _system); ((MF_ReliabTransport*)(trnsp))->setTransSetting(transSetting); } else { trnsp = new MF_BasicTransport(ID, &recvBuffer, &sendBuffer, _system); } trnsp->setMyGUID(event->getSrcGUID()); _system->getSocketTable()->addManager(this); if(event->getSrcGUID()==0){ MF_Log::mf_log(MF_DEBUG, "MF_BaseSocketManager:openRequest using device default srcGUID"); _system->getSocketTable()->addGUID(event->getUID(), _system->getRouter()->getDefaultGUID()); GUIDs.push_back(_system->getRouter()->getDefaultGUID()); } else{ _system->getSocketTable()->addGUID(event->getUID(), event->getSrcGUID()); _system->getRouter()->addGUID(event->getSrcGUID()); GUIDs.push_back(event->getSrcGUID()); } _system->getSocketTable()->addTID(ID, ID); startAliveTimer(); MF_Log::mf_log(MF_DEBUG, "MF_BaseSocketManager:openRequest opened new socket with ID=%u default srcGUID=%d", ID, event->getSrcGUID()); open = true; openReplySuccess(); connectToClient(); return 0; }
static void sendDeleteOneToClient(char clientId, u32 m_token) { int sockFd = 0; clntData_t *data = NULL; CLIENT_DB *cdb = getClientDbInstance(); data = createClientMsg(clientId,m_token,client_delete_req_m); if(connectToClient(clientId,&sockFd) != G_OK) { LOG_ERROR("Unable to connect to client"); free(data); return; } if(sendOneUpdate(data,sockFd) != G_OK) { LOG_ERROR("Unable to send delete message to client"); free(data); closeSocket(sockFd); } free(data); closeSocket(sockFd); }
void SaveConfig::go() { FdPtr_t sockfd = connectToClient(*this); //< create a connection Marshall marshall; //< create a marshaller marshall.setFd(*sockfd); //< tell the marshaller the socket to use handshake(marshall); //< perform handshake protocol // send the message messages::SaveConfig* msg = new messages::SaveConfig(); // fill the message msg->set_filename(fileName.getValue()); // send the message to the backend marshall.writeMsg(msg); // wait for the reply RefPtr<AutoMessage> reply = marshall.read(); // if the backend replied with a message we weren't expecting then // print an error if( reply->type != MSG_UI_REPLY ) { std::cerr << "Unexpected reply of type: " << messageIdToString( reply->type ) << "\n"; } // otherwise print the result of the operation else { messages::UserInterfaceReply* msg = static_cast<messages::UserInterfaceReply*>(reply->msg); std::cout << "Server reply: " << "\n ok? : " << (msg->ok() ? "YES" : "NO") << "\nmessage : " << msg->msg() << "\n"; } }
void * sendAllUpdateToClient(void *data) { int i = 0, j = 0; char isClientConnected = 0; int sockFd = 0; RESULT sendResult = G_FAIL; char clientId = *((char*)data); clntData_t clntData; CLIENT_DB *cdb = getClientDbInstance(); if(!cdb) { LOG_ERROR("Error in client db instance"); return; } if(clientId >= MAX_CLIENT) { LOG_ERROR("Invalid client Id, clntId =%d",clientId); return NULL; } if(cdb->clientState[clientId] == clnt_unregister_state) { LOG_ERROR("Client is already de registered, clntId =%d",clientId); return NULL; } PLAYLIST *pl = cdb->playList; // LOCK the playlist pthread_mutex_lock(&pl->playListLock); if(pl->playListSize <= 0) { LOG_MSG("Playlist is empty, nothing to update"); pthread_mutex_unlock(&pl->playListLock); return NULL; } LIST_NODE *tempNode = NULL; for(i=0; i<MAX_CLIENT; i++) { // skip current client and unregistered client if((cdb->clientState[clientId] == clnt_unregister_state) || (i == clientId)) continue; //skip client having not data if(pl->pList[i].totalNode == 0) { continue; } tempNode = pl->pList[i].first; for(j=0; j<pl->pList[i].totalNode; j++) { // create client message; clntData.header.clntId = clientId; clntData.header.msgId = client_update_all; clntData.header.isLast = 0; clntData.header.token = getNewToken(); clntData.header.totalSize = 0; clntData.payLoad = ((PlayListData*)(tempNode->data))->data; clntData.payloadSize = ((PlayListData*)(tempNode->data))->size; //if client is not connected connect with it if(!isClientConnected) { if(connectToClient(clientId, &sockFd) != G_OK) { LOG_ERROR("Unable to connect with client for sending update"); break; } isClientConnected = 1; } if((sendResult = sendOneUpdate(&clntData, sockFd)) != G_OK) { LOG_ERROR("Sending update all fail"); break; } tempNode = tempNode->next; clntData.payLoad = NULL; clntData.payloadSize = 0; } if(sendResult != G_OK) { break; } } if(isClientConnected) { closeSocket(sockFd); } pthread_mutex_unlock(&pl->playListLock); }
int main(int argc, char *argv[]){ struct sockaddr_in server; int new_sock, server_sock = -1; int addrlen; char command[128], buf[128]; if (argc != 2) { (void) fprintf(stderr,"usage: %s port# \n",argv[0]); exit(1); } portnum = atoi(argv[1]); // Create a Server Socket if((server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ perror("socket"); exit(1); } memset((void*)&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons((u_short)atoi(argv[1])); if(bind(server_sock, (struct sockaddr *)&server, sizeof server) < 0) { perror("bind"); exit(1); } if(listen(server_sock, SOMAXCONN) < 0) { perror("listen"); exit(1); } // // // while(1){ // Input from the keyboard memset(command, 0x00, sizeof command); addrlen = sizeof server; new_sock = accept(server_sock, (struct sockaddr *)&server, (socklen_t *)&addrlen); if (new_sock < 0) { perror("accept"); exit(1); } printf("connection : Host IP %s, Port %d, socket %d\n", inet_ntoa(server.sin_addr), ntohs(server.sin_port), new_sock); read(new_sock, command, sizeof command); // read user command printf("%s", command); if(!strncmp(command, "@quit", 5)){ // quit memset(buf, 0x00, sizeof(buf)); strcat(buf, "@delete "); strcat(buf, inet_ntoa(server.sin_addr)); strcat(buf, " "); strcat(buf, toArray(ntohs(server.sin_port))); struct node* delNode = find(inet_ntoa(server.sin_addr), ntohs(server.sin_port)); int roomNum = delNode->room; delNode->room = 0; current = head; while(current != NULL){ if(current->room == roomNum) connectToClient(current->IP, toArray(current->port), buf); current = current->next; } } else if(!strncmp(command, "@exit", 5)){ // exit memset(buf, 0x00, sizeof(buf)); strcat(buf, "@delete "); strcat(buf, inet_ntoa(server.sin_addr)); strcat(buf, " "); strcat(buf, toArray(ntohs(server.sin_port))); strcat(buf, "\n"); int roomNum = find(inet_ntoa(server.sin_addr), ntohs(server.sin_port))->room; deletes(inet_ntoa(server.sin_addr), ntohs(server.sin_port)); if(roomNum != 0){ current = head; while(current != NULL){ if(current->room == roomNum) connectToClient(current->IP, toArray(current->port), buf); current = current->next; } } } else if(!strncmp(command, "@connect", 8)){ // connect insertFirst(inet_ntoa(server.sin_addr), ntohs(server.sin_port), &command[9], 0); printf("%s is connected\n", &command[9]); if (write(new_sock, "connection ok", strlen("connection ok")) < 0) { perror("write"); exit(1); } } else if(!strncmp(command, "@getlist", 8)){ // user & room list memset(buf, 0x00, sizeof(buf)); for(int i=0; i<room_size; i++){ if(i == 0){ strcat(buf, "\n==========waiting room "); strcat(buf, "==========\n"); } else{ strcat(buf, "==========room# "); strcat(buf, toArray(i)); strcat(buf, "==========\n"); } current = head; while(current != NULL){ if(current->room == i){ strcat(buf, current->IP); strcat(buf, " "); strcat(buf, toArray(current->port)); strcat(buf, " "); strcat(buf, current->ID); strcat(buf, "\n"); } current = current->next; } } if (write(new_sock, buf, strlen(buf)) < 0) { perror("write"); exit(1); } } else if(!strncmp(command, "@mkroom", 7)){ // mkroom room_size++; memset(buf, 0x00, sizeof(buf)); strcat(buf, "room "); strcat(buf, toArray(room_size)); strcat(buf, " is created\n"); if (write(new_sock, buf, strlen(buf)) < 0) { perror("write"); exit(1); } } else if(!strncmp(command, "@join", 5)){ // join int roomNum = atoi(&command[6]); memset(buf, 0x00, sizeof(buf)); strcat(buf, "@add "); strcat(buf, inet_ntoa(server.sin_addr)); strcat(buf, " "); strcat(buf, toArray(ntohs(server.sin_port))); strcat(buf, "\n"); char join[1024]; memset(join, 0x00, sizeof(join)); strcat(join, "@join\n"); int i = 0; current = head; while(current != NULL){ if(strcmp(toArray(ntohs(server.sin_port)), toArray(current->port)) && current->room == roomNum){ connectToClient(current->IP, toArray(current->port), buf); strcat(join, current->IP); strcat(join, " "); strcat(join, toArray(current->port)); strcat(join, " "); strcat(join, current->ID); strcat(join, "\n"); } current = current->next; } if (write(new_sock, join, strlen(join)) < 0) { perror("write"); exit(1); } find(inet_ntoa(server.sin_addr), ntohs(server.sin_port))->room = atoi(&command[6]); printf("room to %d\n", atoi(&command[6])); printf("room to %d\n", atoi(&command[6])); } } }// main
void getEntry(int *team, int *stype) { int switching = -1; /* confirm switches 7/27/91 TC */ inputMask = CP_OUTFIT; for (;;) { /* updateShips so he knows how many players on each team */ if (blk_flag) updateShips(); sendMaskPacket(tournamentMask(me->p_team)); if (blk_flag) briefUpdateClient(); flushSockBuf(); /* Have we been busted? */ if (me->p_status == PFREE) { me->p_status = PDEAD; me->p_explode = 600; } socketPause(); readFromClient(); if (isClientDead()) { int i; if (noressurect) exitGame(); printf("Ack! The client went away!\n"); printf("I will attempt to resurrect him!\n"); /* UDP fail-safe */ commMode = COMM_TCP; if (udpSock >= 0) closeUdpConn(); /* For next two minutes, we try to restore connection */ shutdown(sock, 2); sock = -1; for (i = 0;; i++) { switch (me->p_status) { case PFREE: me->p_status = PDEAD; me->p_explode = 600; break; case PALIVE: case POBSERVE: me->p_ghostbuster = 0; break; case PDEAD: me->p_explode = 600; break; default: me->p_explode = 600; me->p_ghostbuster = 0; break; } sleep(5); if (connectToClient(host, nextSocket)) break; if (i == 23) { printf("Oh well, maybe I'm getting rusty!\n"); switch (me->p_status) { case PFREE: break; case PALIVE: case POBSERVE: me->p_ghostbuster = 100000; break; case PDEAD: me->p_explode = 0; break; default: me->p_explode = 0; me->p_ghostbuster = 100000; break; } exitGame(); } } printf("A miracle! He's alive!\n"); teamPick = -1; updateSelf(); updateShips(); flushSockBuf(); } if (teamPick != -1) { if (teamPick < 0 || teamPick > 3) { warning("Get real!"); sendPickokPacket(0); teamPick = -1; continue; } if (!(tournamentMask(me->p_team) & (1 << teamPick))) { warning("I cannot allow that. Pick another team"); sendPickokPacket(0); teamPick = -1; continue; } if (((1 << teamPick) != me->p_team) && (me->p_team != ALLTEAM)) /* switching teams 7/27/91 TC */ if ((switching != teamPick) && (me->p_whydead != KGENOCIDE) && !status2->league ) { switching = teamPick; warning("Please confirm change of teams. Select the new team again."); sendPickokPacket(0); teamPick = -1; continue; } /* His team choice is ok. */ if (shipPick < 0 || shipPick >= NUM_TYPES) { warning("That is an illegal ship type. Try again."); sendPickokPacket(0); teamPick = -1; continue; } if (!allowed_ship(1 << teamPick, mystats->st_rank, mystats->st_royal, shipPick)) { sendPickokPacket(0); teamPick = -1; continue; } if (shipvals[shipPick].s_nflags & SFNMASSPRODUCED) { warning("o)utpost, u)tility, or s)tandard?"); sendPickokPacket(0); tmpPick = shipPick; continue; } break; } if (me->p_status == PTQUEUE) { if (status->tourn) detourneyqueue(); /* You don't time out on the tourney queue */ me->p_ghostbuster = 0; } } *team = teamPick; if ((shipvals[tmpPick].s_nflags & SFNMASSPRODUCED) && ((shipvals[shipPick].s_numports) || (shipPick == SCOUT))) { *stype = tmpPick; tmpPick = CRUISER; } else { *stype = shipPick; tmpPick = CRUISER; } sendPickokPacket(1); flushSockBuf(); }
int main(int argc, char **argv) { // 매개변수 1:자기포트 2:서버IP 3:서버포트 4:자기ID int tcpServ_sock; struct sockaddr_in tcpServer_addr; struct sockaddr_in newTcp_addr; fd_set reads, temps; int fd_max; char command[1024]; if(argc != 5){ printf("Usage : %s <myport> <serverIP> <serverport> <myID>\n", argv[0]); exit(1); } display(); if ((tcpServ_sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); }// creating socket descriptor for tcp memset((void *) &tcpServer_addr, 0, sizeof (tcpServer_addr)); tcpServer_addr.sin_family = AF_INET; tcpServer_addr.sin_addr.s_addr = INADDR_ANY; tcpServer_addr.sin_port = htons((u_short)atoi(argv[1])); // portnum fd_max = 10; if (bind(tcpServ_sock, (struct sockaddr *)&tcpServer_addr, sizeof (tcpServer_addr)) < 0) { perror("bind error"); exit(1); } // bind if (listen(tcpServ_sock, SOMAXCONN) < 0) { perror("listen"); exit(1); } // wait connect // 여기까지 기본 소켓세팅 hostIP = argv[2]; // ip hostport = argv[3]; // port numbere myID = argv[4]; char buf[1024]; strcat(buf, "@connect "); strcat(buf, myID); //peertcpSockets = connectToServer(buf); peertcpSockets = connectToServer(buf); FD_ZERO(&reads); FD_SET(fileno(stdin), &reads); FD_SET(tcpServ_sock, &reads); FD_SET(peertcpSockets, &reads); while(1){ int nfound; temps = reads; nfound = select(fd_max+1, &temps, 0, 0, NULL); // nfound? if(FD_ISSET(fileno(stdin), &temps)) { // Input from the keyboard char sendhttp[1024]; memset(sendhttp, NULL, sizeof(sendhttp)); fgets(command, sizeof (command), stdin); if( command[0] == '@' ){ // send to server if(command[1] == 'e'){ // when exit head = NULL; peertcpSockets = connectToServer(command); close(peertcpSocket); exit(1); } peertcpSockets = connectToServer(command); FD_SET(peertcpSockets, &reads); // exit했을때는 나에게 들어있는 유저목록 다 지워야한다. }else{ node* cnode = head; char sendmsg[1024]; strcat(sendmsg, myID); strcat(sendmsg, ") "); strcat(sendmsg, command); while(cnode != NULL){ peertcpSockets = connectToClient(head->IP, toArray(head->port), sendmsg); close(peertcpSockets); cnode = cnode->next; } // 유저에게 메시지 전송 close(peertcpSocket); } fflush(stdin); }else if(FD_ISSET(tcpServ_sock, &temps)){ int addrlen; addrlen = sizeof(newTcp_addr); peertcpSockets = accept(tcpServ_sock, (struct sockaddr *)&newTcp_addr, (unsigned int*)&addrlen); //printf("connection from host %s, port %d, socket %d\n\n", // inet_ntoa(newTcp_addr.sin_addr), ntohs(newTcp_addr.sin_port), peertcpSocket); if (peertcpSockets < 0) { perror("accept"); exit(1); } FD_SET(peertcpSockets, &reads); // make connection }else if(FD_ISSET(peertcpSockets, &temps)){ // 서버에서 응답받은 내용 char buf[1024]; memset(buf, NULL, sizeof(buf)); read(peertcpSockets, buf, sizeof(buf)); char tbuf[1024]; strcpy(tbuf, buf); char* inif = strtok(tbuf, "\n"); if(!strcmp(touppers(inif),"JOIN")){ char* temp; temp = strtok(buf, "\n"); printf("%s\n", temp); // 입력받은 첫줄 출력 while((temp = strtok(NULL, "\n")) != NULL){ char* tempIP = strtok(temp, " "); char* tempPort = strtok(NULL, " "); int tport = atoi(tempPort); char* tempID = strtok(NULL, " "); insertFirst(tempIP, tport, tempID, 0); } close(peertcpSockets); }else if(!strcmp(touppers(inif),"INVITE OK")){ printf("%s\n", inif); char* temp; temp = strtok(NULL, "\n"); char* tempIP = strtok(temp, " "); char* tempPort = strtok(NULL, " "); char* tempID = strtok(NULL, " "); printf("invite %s\n", tempID); int tport = atoi(tempPort); insertFirst(tempIP, tport, tempID, 0); close(peertcpSockets); // invite에 성공했다면 그사람을 저장한다. }else if(!strcmp(touppers(inif),"@ADD")){ printf("%s\n", inif); char* tempIP = strtok(NULL, " "); char* tempPort = strtok(NULL, " "); char* tempID = strtok(NULL, " "); int tport = atoi(tempPort); insertFirst(tempIP, tport, tempID, 0); close(peertcpSockets); // close 소켓 서버에서?유저에서? }else if(!strcmp(touppers(inif),"@DELETE")){ printf("%s\n", inif); char* tempIP = strtok(NULL, " "); char* tempPort = strtok(NULL, " "); int tport = atoi(tempPort); deletes(tempIP, tport); close(peertcpSockets); }else{ printf("%s\n",buf); // print receive msg close(peertcpSockets); //FD_CLR(peertcpSockets, &reads); } buf[0] = '\0'; printf("> "); }// receive fflush(stdout); } }//main End