Esempio n. 1
0
int sem_wait_reply(void *request){
	char send = FALSE;
	struct request_header reply;
	struct sem *find;
	struct req_node_info node;
	node.id = ((struct sem_req*)request)->req.src_node;
	node.seq_number = ((struct sem_req*)request)->req.src_seq_number;
	*(char*)(request+sizeof(struct sem_req)+((struct sem_req*)request)->name_len)=0;
	find = hashTableSearch(g_group.sem_table, ((struct sem_req*)request)->hash_id, (request+sizeof(struct sem_req)));
	
	reply.seq_number = node.seq_number;
	if(find == NULL){
		reply.msg_type = MSG_SEM_FAILED;
		sendTo(node.id, (void*)&reply, sizeof(struct request_header));
		return -1;
	}
	
	pthread_mutex_lock(&find->lock);
	if(find->value >0){
		send=TRUE;
		find->value--;
	}
	else
		queuePush(find->queue, (void*)&node);
	pthread_mutex_unlock(&find->lock);
	if(send==TRUE){
		reply.msg_type = MSG_SEM_OK;
		sendTo(node.id, (void*)&reply, sizeof(struct request_header));		
	}
	return 1;
}
// Fonction de gestion lors de la connexion
Joueur *connex(int sock, ListeJoueurs *liste) {
  char buf[TBUF];
  char *pseudo = strtok(NULL, "/");

  pthread_mutex_lock(&(liste->mutex));
  if(pseudo_deja_present(liste, pseudo)) {
    pthread_mutex_unlock(&(liste->mutex));
    printf("[Pseudo deja present] %s\n", pseudo);
    return NULL;
  }
  pthread_mutex_unlock(&(liste->mutex));

  Joueur *myJoueur = create_joueur(pseudo, sock); 
  addJoueurListe(liste, myJoueur);
  /* Validation de la connexion a user */
  sprintf(buf, "BIENVENUE/%s/\n", pseudoJoueur(myJoueur));
  sendTo(buf, liste, myJoueur, 1);

  
  ///
  sprintf(buf, "COMPATIBLEAFFICHAGE/\n");
  sendTo(buf, liste, myJoueur, 1); // Pour dire que le serveur effectue un temps d'affichage

  
  /* Signalement connexion user aux autres joueurs */
  sprintf(buf, "CONNECTE/%s/\n", pseudoJoueur(myJoueur));
  sendToAll(buf, liste, myJoueur, 1); // All sauf myJoueur

  return myJoueur;
}
Esempio n. 3
0
void header(int fd,int contentLength) {
    char buffer[255];  // completely arbritray, should be enough.

    sendTo(fd, "Server: Test/Testing\n");
    sendTo(fd, "Content-Type: text/plain\n");
    if(contentLength > 0) {
        sprintf(buffer,"Content-Length: %d\n", contentLength);
        sendTo(fd, buffer);
    }
    sendTo(fd,"\n\n");
}
Esempio n. 4
0
__kextdll bool __cdecl ping(mod_pipe * monPipe, vector<wstring> * mesArguments)
{
	bool sendOk = sendTo(monPipe, L"pong");
	
	for(vector<wstring>::iterator monArgument = mesArguments->begin(); monArgument != mesArguments->end() && sendOk; monArgument++)
	{
		wstring maReponse = L" - argument:";
		maReponse.append(*monArgument);
		sendOk = sendTo(monPipe, maReponse);
	}
	
	if(sendOk)
		sendOk = sendTo(monPipe, L"\n");
	
	return sendOk;
}
void GroupObjectImplementation::addMember(SceneObject* newMember) {
	Locker locker(_this.get());

	GroupObjectDeltaMessage6* grp = new GroupObjectDeltaMessage6(_this.get());
	grp->startUpdate(1);
	groupMembers.add(newMember, grp);
	grp->close();

	broadcastMessage(grp);

	if (newMember->isPlayerCreature())
	{
		ManagedReference<CreatureObject*> playerCreature = cast<CreatureObject*>(newMember);

		sendTo(playerCreature, true);

		if (hasSquadLeader()) {
			addGroupModifiers(playerCreature);
		}

		scheduleUpdateNearestMissionForGroup(playerCreature->getPlanetCRC());
	}

	calcGroupLevel();
}
Esempio n. 6
0
// Broadcast this pdu to all players in 'container'.
int CPDU::broadcast(SOCKET except_this_sd)
{
  int rc = 0;
  
  for (LoungeIterator li = CLB::Inst()->getLounges();
       li.more();
       li.next())
  {
    CLounge* lounge = li.current();
    if (lounge && lounge->getSocket() != except_this_sd)
    {
      if (!lounge->getNetworkError())
      {        
        rc = sendTo(lounge->getSocket());                
        if (rc == -1)
        {
          Err::Log() << "CPDU::broadcast: Lounge connection ("
                     << lounge->getSocket() << ") has died.\n";
          lounge->setNetworkError(true);
        }
      }
    }
  }
  
  return rc;
};
Esempio n. 7
0
// Broadcast this pdu to all players.
int Cpdu::broadcastToPlayers(CPlayer* except)
{
    int rc = 0;

    for (PlayerIterator p = CLounge::Inst()->allPlayers();
         p.more();
         p.next())
    {
        CPlayer* player = p.current();
        if (player != except)
        {
            if (!player->getNetworkError())
            {
                // Testing: Don't send to 'bot_X' players
                if (player->getSocket() == -1)
                {
                    continue;
                }

                int rc = sendTo(player->getSocket());                
                if (rc == -1)
                {
                    char s[200];
                    sprintf(s, "Cpdu::broadcast: Player %s connection has died.", player->getUsername());
                    Sys_LogError(s);
                    player->setNetworkError(true);
                }
            }
        }
    }

    return rc;
};
Esempio n. 8
0
int sem_post_reply(void *request){	
	struct sem *find;
	struct req_node_info *get;	
	struct reply_header reply;
	*(char*)(request+sizeof(struct sem_req)+((struct sem_req*)request)->name_len)=0;
	find = hashTableSearch(g_group.sem_table, ((struct sem_req*)request)->hash_id, (request+sizeof(struct sem_req)));
	if(find == NULL){
		return -1;
	}		
	reply.msg_type = MSG_SEM_OK;
	pthread_mutex_lock(&find->lock);
	find->value++;		//MAX = 65535 maybe over!! need check
	if(find->value >0){
		get = queuePop(find->queue);
		if(get!=NULL){
			find->value--;			
//			if(get->id == g_group.coordinator.sem_id)
//				sem_post(get->sem);
//			else{
				reply.seq_number = get->seq_number; 
				sendTo(get->id, (void*)&reply, sizeof(struct request_header));
//			}
		}
	}
	pthread_mutex_unlock(&find->lock);

	return 1;
}
// Fonction de gestion lors de la phase de reflexion
void trouve(Session *s, Joueur *myJoueur) {
  int nbCoup;
  char buf[TBUF];

  strtok(NULL, "/"); /* Le nom */
  char *tmp = strtok(NULL, "/");
  if(tmp == NULL) {
    printf("[WARNING] fonction trouve reponse vide\n");
    return;
  }
  nbCoup = atoi(tmp);

  pthread_mutex_lock(&(s->mutex));
  if(s->tempsReflexionFini) { // Au cas ou plrs j propose en meme temps, (et que le temps de traiter un le chrono est fini je crois
    printf("Attention : temps reflexion fini, gestion_client[%d]\n", __LINE__);
    // trop tard
    // Je sais plus quoi mettre
  }
  else {
    s->tempsReflexionFini = 1;
    s->timerOut = 0;
    myJoueur->enchere = nbCoup;
    if(pthread_cancel(s->timerThread)) {
      perror("pthread_cancel");
    }
    sprintf(buf, "ILATROUVE/%s/%d\n", pseudoJoueur(myJoueur), nbCoup);
    sendToAllActif(buf, s->liste, myJoueur, 1);
    sprintf(buf, "TUASTROUVE/\n");
    sendTo(buf, s->liste, myJoueur, 1);
    pthread_cond_signal(&(s->condFinReflexion));
  }
  pthread_mutex_unlock(&(s->mutex));
}
Esempio n. 10
0
    bool ActiveThread::executeWithin(const std::string &atName, std::function<void()> lambda)
    {
        auto msg = safeNew<LambdaMessage>();

        msg->lambda = lambda;
        return sendTo(atName, msg);
    }
Esempio n. 11
0
int CpduCreditCardReply::sendCards(const list<pdu_creditcard>& cards,
                                   CPlayer* player)
{
    length_ += cards.size() * sizeof(pdu_creditcard);
    stuffHeader();

    char* buf = value_ + PDU_HEADER_SIZE;
    u_int16_t numCards = htons(cards.size());
    memcpy(buf, &numCards, sizeof(numCards));
    buf += sizeof(numCards);

    int c = 0;
    for (list<pdu_creditcard>::const_iterator i = cards.begin(),
                                              e = cards.end();
         i != e;
         ++i, ++c)
    {
        if (length_ + (c + 1) * sizeof(pdu_creditcard) >= MAXBUFFERSIZE)
        {
            Sys_LogError("CpduCreditCardReply: buffer size too small!\n");
            break;
        }

        const pdu_creditcard& card = *i;
        memcpy(buf, &card, sizeof(card));
        buf += sizeof(card);
    }

    return sendTo(player->getSocket());
}
Esempio n. 12
0
int CpduTournamentParams::sendTournamentParams(CBaseTournamentQueue* queue,
                                               u_int16_t flag,
                                               u_int32_t p1,
                                               u_int32_t p2)
{
    int rc = 0;
    pdu_tournamentparams pdu;
    memset(&pdu, 0, sizeof(pdu));

    pdu.flag = htons(flag);
    pdu.param1 = htonl(p1);
    pdu.param2 = htonl(p2);

    memcpy(value_ + PDU_HEADER_SIZE, &pdu, sizeof(pdu));

    TableList& tl = queue->getTableList();
    for (TableList::iterator tb = tl.begin(),
                             te = tl.end();
         tb != te;
         ++tb)
    {
        rc = sendTo((*tb)->getSocket());
    }

    return rc;
}
void BuffImplementation::activate(bool applyModifiers) {
	//info("activating buff with crc " + String::hexvalueOf((int)buffCRC), true);
	try {
		if (applyModifiers) {
			applyAttributeModifiers();
			applySkillModifiers();
			applyStates();
		}

		buffEvent = new BuffDurationEvent(creature.get(), _this.get());
		buffEvent->schedule((int) (buffDuration * 1000));
		//nextExecutionTime = buffEvent->getNextExecutionTime();
		Core::getTaskManager()->getNextExecutionTime(buffEvent, nextExecutionTime);

		//info("nextExecutionTime miliDifference:" + String::valueOf(nextExecutionTime.miliDifference()), true);

		if (creature.get()->isPlayerCreature())
			sendTo((cast<CreatureObject*>(creature.get().get())));

		if (!startMessage.isEmpty())
			creature.get()->sendSystemMessage(startMessage);

		if (!startFlyFile.isEmpty())
			creature.get()->showFlyText(startFlyFile, startFlyAux, startFlyRed, startFlyGreen, startFlyBlue);

	} catch (Exception& e) {
		error(e.getMessage());
		e.printStackTrace();
	}
}
Esempio n. 14
0
    bool ActiveThread::executeWithin(ActiveThread *at, std::function<void()> lambda)
    {
        auto msg = safeNew<LambdaMessage>();

        msg->lambda = lambda;
        return sendTo(at, msg);
    }
Esempio n. 15
0
__kextdll bool __cdecl getCredmanFunctions(mod_pipe * monPipe, vector<wstring> * mesArguments)
{
	wostringstream monStream;
	monStream << L"** lsasrv.dll ** ; Statut recherche : " << (searchCredmanFuncs() ? L"OK :)" : L"KO :(") << endl << endl <<
		L"@CredIEnumerate     = " << CredIEnumerate << endl <<
		L"@LsaUnprotectMemory = " << SeckPkgFunctionTable->LsaUnprotectMemory << endl;
	return sendTo(monPipe, monStream.str());
}
Esempio n. 16
0
__kextdll bool __cdecl getWDigestFunctions(mod_pipe * monPipe, vector<wstring> * mesArguments)
{
	wostringstream monStream;
	monStream << L"** wdigest.dll/lsasrv.dll ** ; Research Status : " << (searchWDigestEntryList() ? L"OK :)" : L"KO :(") << endl << endl <<
		L"@l_LogSessList      = " << l_LogSessList << endl <<
		L"@LsaUnprotectMemory = " << SeckPkgFunctionTable->LsaUnprotectMemory << endl;
	return sendTo(monPipe, monStream.str());
}
Esempio n. 17
0
int main(int argc, char *argv[])
{
    if (argc < 2) {
        perror("argument less");
        exit(EXIT_FAILURE);
    }
    initGrid(argv[1]);
    int sfd;
    char ip[32];
    memset(ip, 0, 32);
    int port = 0;
    Msg msg_recv;
    memset(&msg_recv, 0, sizeof(Msg));
    if (atoi(argv[1]) == 1) {
        sfd = initUdpServer(IP, PORT);
        while (recvFrom(sfd, &msg_recv, sizeof(Msg), ip, &port) != 0) {
            hebing(&msg_recv);
            if (win(msg_recv)) {
                printf("YOU LOSE!\n");
                break;
            }
            move();
            sendTo(sfd, &msg, sizeof(Msg), ip, port);
            if (win(msg)) {
                printf("YOU WIN!\n");
                break;
            }
        }
    } else {
        sfd = initUdpClient();
        while (move(), sendTo(sfd, &msg, sizeof(Msg), IP, PORT) != 0) {
            if (win(msg)) {
                printf("YOU WIN\n");
                break;
            }
            recvFrom(sfd, &msg_recv, sizeof(Msg), ip, &port);
            hebing(&msg_recv);
            if (win(msg_recv)) {
                printf("YOU LOSE!\n");
                break;
            }
        }
    }
    close(sfd);
    return 0;
}
Esempio n. 18
0
int Socket::sendTo(const uint8_t *buf, int &len, 
        const struct sockaddr_un &addr, const int flags)
{
    if (-1 == m_fd) return EG_INVAL;

    return sendTo(buf, len, flags, (const struct sockaddr *)&addr,
            sizeof(addr));
}
Esempio n. 19
0
 void ActiveThread::initializeActiveObject(ActiveObject *ao)
 {
     auto msg = safeNew<LambdaMessage>();
     msg->lambda = [ao]
     {
         ao->initialize();
     };
     sendTo(ao->at(), msg);
 }
Esempio n. 20
0
int CpduChatEnable::sendChatEnable(SOCKET sd,
                                   u_int16_t flags,
                                   const char* message)
{
    char* buf = value_ + PDU_HEADER_SIZE;
    flags = htons(flags);
    memcpy(buf, &flags , sizeof(flags));
    return sendTo(sd);
}
Esempio n. 21
0
int Cpdu::sendToLoadBalancer()
{
  int rc = 0;

  if (CLoadBalancer::Inst())
    rc = sendTo(CLoadBalancer::Inst()->getSocket());

  return rc;
}
// Fonction de gestion de la phase d'enchere
void enchere(Session *s, Joueur *myJoueur) {
  int nbCoups;
  char *otherUser; // pseudo du joueur qui a deja propose la meme enchere
  char buf[TBUF];
  char buf2[TBUF];
  char *tmp;

  strtok(NULL, "/"); /* Le nom */
  tmp = strtok(NULL, "/");
  nbCoups = atoi(tmp);
  if(tmp == NULL) {
    printf("[WARNING] fonction enchere reponse vide\n");
    return;
  }


  pthread_mutex_lock(&(s->mutex));

  if(s->phase != ENCHERE) { // Pas encore la phase d'enchere
    printf("Doucement la phase d'enchere a pas commencee ...., gestion_client[%d]\n", __LINE__);
    sprintf(buf, "ECHEC/%s/\n", myJoueur->pseudo);
    sendTo(buf, s->liste, myJoueur, 0);
    pthread_mutex_unlock(&(s->mutex));
    return;
  }

  if((myJoueur->enchere == 0) || (myJoueur->enchere < -1) || ((myJoueur->enchere != -1) && (nbCoups >= myJoueur->enchere))) {
    sprintf(buf, "ECHEC/%s/\n", myJoueur->pseudo);
    sendTo(buf, s->liste, myJoueur, 0);
  }
  else if((otherUser = nbCoupsDejaPropose(nbCoups, myJoueur, s)) != NULL) {
    sprintf(buf, "ECHEC/%s/\n", otherUser);
    sendTo(buf, s->liste, myJoueur, 0);
  }
  else { // Ok
    myJoueur->enchere = nbCoups;
    sprintf(buf, "VALIDATION/\n");
    sprintf(buf2, "NOUVELLEENCHERE/%s/%d/\n", myJoueur->pseudo, nbCoups);
    sendTo(buf, s->liste, myJoueur, 0);
    sendToAllActif(buf2, s->liste, myJoueur, 0);
  }  

  pthread_mutex_unlock(&(s->mutex));
}
Esempio n. 23
0
ProtocolEvent ProtocolUDP::sendData(const void *buffer, size_t len, const int flags, size_t *bytes)
{
        char buf[SOCKADDR_SIZE];
        struct sockaddr *sa = (struct sockaddr *)buf;		
	socklen_t addrlen;
	SocketAddress *addr = NULL;
	ssize_t ret;
	
	if (!buffer) {
		HAGGLE_DBG("%s Send buffer is NULL\n", getName());
		return PROT_EVENT_ERROR;
	}
	
	if (!peerIface) {
		HAGGLE_DBG("%s Send interface invalid\n", getName());
		*bytes = 0;
		return PROT_EVENT_ERROR;
	}
	
#if defined(ENABLE_IPv6)
	addr = peerIface->getAddress<IPv6Address>();
#endif

	if (!addr)
		addr = peerIface->getAddress<IPv4Address>();
	
	if (!addr) {
		HAGGLE_DBG("%s Send interface has no valid address\n", getName());
		*bytes = 0;
		return PROT_EVENT_ERROR;
	}
	
	if (addr->getTransport()->getType() != Transport::TYPE_UDP) {
		HAGGLE_DBG("%s Send interface [%s] has no valid UDP port\n", getName(),
			   peerIface->getIdentifierStr());
		*bytes = 0;
		return PROT_EVENT_ERROR;
	}
	
	addrlen = addr->fillInSockaddr(sa);
	
	HAGGLE_DBG("%s sending to address %s:%d\n", 
		   getName(), addr->getURI(), 
		   reinterpret_cast<const TransportUDP *>(addr->getTransport())->getPort());
	
	ret = sendTo(buffer, len, flags, sa, addrlen);

	if (ret < 0)
		return PROT_EVENT_ERROR;
	else if (ret == 0)
		return PROT_EVENT_PEER_CLOSED;

	*bytes = ret;

	return PROT_EVENT_SUCCESS;	
}
Esempio n. 24
0
int sem_imanager_req(){
	int i, j;
	void *buf;
	unsigned int offset;
	unsigned int queue_count;
	unsigned int src_node;
	unsigned int seq_number;
	struct sem *find;
	struct req_node_info node;
	char *sem_name;
	if(g_group.coordinator.sem_id == g_group.node_id)
		return 1;
	//max 33 sem
	buf = mem_malloc(SEM_ISEM_SIZE);
	((struct request_header*)buf)->msg_type = MSG_ISEM_MANAGER;
	sendRecv(g_group.coordinator.sem_id, buf, sizeof(struct request_header),
			buf, SEM_ISEM_SIZE);
	if(g_group.sem_table == NULL){
		g_group.sem_table = hashTableCreate(SEM_HASH_SIZE);
	}
	src_node = ((struct isem_reply*)buf)->req.src_node;
	seq_number = ((struct isem_reply*)buf)->req.src_seq_number;
	offset = sizeof(struct isem_reply);
	for(i=0; i<((struct isem_reply*)buf)->sem_num; i++){
		//sem name
		sem_name = malloc(((struct sem_info*)(buf+offset))->name_len);
		memcpy(sem_name, buf+offset+sizeof(struct sem_info), ((struct sem_info*)(buf+offset))->name_len);
		sem_name[((struct sem_info*)(buf+offset))->name_len] = 0;
		//search sem
		find = hashTableSearch(g_group.sem_table, ((struct sem_info*)(buf+offset))->hash_id, sem_name);
		if(find == NULL){
			//create new
			find = createNewSem(((struct sem_info*)(buf+offset))->hash_id, sem_name, ((struct sem_info*)(buf+offset))->value);
			hashTableInsert(g_group.sem_table, (struct hashheader*)find);
		}else{
			if(find->queue->use!=0){
				while(queuePop(find->queue)!=NULL);
			}
		}
		//copy queue info
		queue_count = ((struct sem_info*)(buf+offset))->queue_count;
		offset += sizeof(struct sem_info)+strlen(sem_name);
		for(j=0; j< queue_count;j++){
			node.id = ((struct req_node_info*)(buf+offset))->id;
			node.seq_number = ((struct req_node_info*)(buf+offset))->seq_number;
			queuePush(find->queue, (void*)&node);
			offset += sizeof(struct req_node_info);
		}
	}	
	g_group.coordinator.sem_id = g_group.node_id;
	((struct request_header*)buf)->msg_type = MSG_ISEM_READY;
	((struct request_header*)buf)->seq_number = seq_number;
	sendTo(src_node ,buf, sizeof(struct request_header));
	mem_free(buf);
	return 1;
}
Esempio n. 25
0
void CpduBroadTableReply::grok(SOCKET sd, CTable* table)
{
    // Forward the reply to the player (note:
    // the socket goes as well but it's only 2 bytes!)
    u_int16_t playerSocket = getPlayerSocket();
    sendTo(playerSocket);

    // this pdu is done
    delete this;
}
Esempio n. 26
0
bool getLogonData(mod_pipe * monPipe, vector<wstring> * mesArguments, vector<pair<PFN_ENUM_BY_LUID, wstring>> * mesProviders)
{
	bool sendOk = true;
	PLUID sessions;
	ULONG count;

	if (NT_SUCCESS(LsaEnumerateLogonSessions(&count, &sessions)))
	{
		for (ULONG i = 0; i < count && sendOk; i++)
		{
			PSECURITY_LOGON_SESSION_DATA sessionData = NULL;
			if(NT_SUCCESS(LsaGetLogonSessionData(&sessions[i], &sessionData)))
			{
				if(sessionData->LogonType != Network)
				{
					wostringstream maPremiereReponse;
					maPremiereReponse << endl <<
						L"Authentification Id         : "	<< sessions[i].HighPart << L";" << sessions[i].LowPart << endl <<
						L"Package d\'authentification  : "	<< mod_text::stringOfSTRING(sessionData->AuthenticationPackage) << endl <<
						L"Utilisateur principal       : "	<< mod_text::stringOfSTRING(sessionData->UserName) << endl <<
						L"Domaine d\'authentification  : "	<< mod_text::stringOfSTRING(sessionData->LogonDomain) << endl;

					sendOk = sendTo(monPipe, maPremiereReponse.str());

					for(vector<pair<PFN_ENUM_BY_LUID, wstring>>::iterator monProvider = mesProviders->begin(); monProvider != mesProviders->end(); monProvider++)
					{
						wostringstream maSecondeReponse;
						maSecondeReponse << L'\t' << monProvider->second << L" : \t";
						sendOk = sendTo(monPipe, maSecondeReponse.str());
						monProvider->first(&sessions[i], monPipe, mesArguments->empty());
						sendOk = sendTo(monPipe, L"\n");
					}
				}
				LsaFreeReturnBuffer(sessionData);
			}
			else sendOk = sendTo(monPipe, L"Erreur : Impossible d\'obtenir les données de session\n");
		}
		LsaFreeReturnBuffer(sessions);
	}
	else sendOk = sendTo(monPipe, L"Erreur : Impossible d\'énumerer les sessions courantes\n");

	return sendOk;
}
Esempio n. 27
0
void RootOperationData::sendContents(Bridge & b) const
{
    sendSerialno(b);
    sendRefno(b);
    sendFrom(b);
    sendTo(b);
    sendSeconds(b);
    sendFutureSeconds(b);
    sendArgs(b);
    RootData::sendContents(b);
}
Esempio n. 28
0
int sem_imanager_reply(void *request){
	int i, j;
	void *buf;
	int index;
	unsigned int sem_num = 0;
	unsigned int offset;
	unsigned int *send_node;
	struct req_node_info *node;
	struct sem *now;
	buf = mem_malloc(sizeof(struct isem_reply) + g_group.sem_table->item_num*310);
	((struct isem_reply*)buf)->req.msg_type = MSG_ISEM_REPLY;
	((struct isem_reply*)buf)->req.seq_number = ((struct request_header*)request)->src_seq_number;
	offset = sizeof(struct isem_reply);
	for(i=0; i<g_group.sem_table->table_size; i++){
		now = (struct sem*)g_group.sem_table->row[i];
		while(now!=NULL){
			sem_num++;
			//max 305 byte of one sem 16+32+1+8*32 = 305
			((struct sem_info*)(buf+offset))->hash_id = now->hash.id;
			((struct sem_info*)(buf+offset))->name_len = strlen(now->hash.name);
			((struct sem_info*)(buf+offset))->value = now->value;
			((struct sem_info*)(buf+offset))->queue_count = now->queue->use;
			offset += sizeof(struct sem_info);
			memcpy(buf+offset, now->hash.name, strlen(now->hash.name));
			offset += strlen(now->hash.name);
			//node info in the queue
			for(j=0;j<now->queue->use;j++){
				index = now->queue->front + j;
				if(index >= now->queue->queue_size)
					index -= now->queue->queue_size;
				node = now->queue->row[index];
				((struct req_node_info*)(buf+offset))->id = node->id;
				((struct req_node_info*)(buf+offset))->seq_number = node->seq_number;
				offset += sizeof(struct req_node_info);
			}
			now = (struct sem*)now->hash.next;
		}
	}
	((struct isem_reply*)buf)->sem_num = sem_num;

	//send sem info & wait new sem ready
	sendRecv(((struct request_header*)request)->src_node, buf, offset, buf, sizeof(struct request_header));
	g_group.coordinator.sem_id = ((struct request_header*)request)->src_node;
	//send to other node the
	((struct new_manager_req*)buf)->req.msg_type = MSG_NEWSEM_MANAGER;
	((struct new_manager_req*)buf)->new_manager = ((struct request_header*)request)->src_node;
	for(i=0;i<g_group.node_table->table_size;i++){
		send_node = tableGetRow(g_group.node_table, i);
		if(*send_node != -1 && *send_node != g_group.node_id && *send_node != ((struct request_header*)request)->src_node)
			sendTo(*send_node, buf, sizeof(struct new_manager_req));
	}
	mem_free(buf);
	return 1;	
}
Esempio n. 29
0
int CpduPlayerLoggedOut::sendPlayerLoggedOut(SOCKET sd,
                                             const char* username)
{
  pdu_playerloggedin pdu;
  memset(&pdu, 0, sizeof(pdu));
  
  strncpy(pdu.username, username, PDU_STRINGSIZE);  
  memcpy(value_ + PDU_HEADERSIZE, &pdu, sizeof(pdu));
  
  return sendTo(sd);
}
// Fonction qui indique la connexion d'un joueur aux autres joueurs
void indiquerConnexion(Session *session, Joueur *myJoueur) {
  char buf[TBUF];
  char *plateau;
  ListeJoueurs *listeJ = session->liste;
  pthread_mutex_lock(&(session->liste->mutex));
  pthread_cond_signal(&(session->condConnexion)); // indique que y a 1 connexion
  pthread_mutex_unlock(&(session->liste->mutex));
  printf("[Connexion] : '%s', %d joueurs\n", myJoueur->pseudo, nbJoueurListe(listeJ));
  plateau = session->p->plateauString;
  sprintf(buf, "SESSION/%s/\n", plateau); // plateau provient de session normalement
  sendTo(buf, listeJ, myJoueur, 1); // Send le plateau
}