Exemple #1
0
//*****************************************************************************
bool Kwave::MenuItem::specialCommand(const QString &command)
{
    Kwave::Parser parser(command);

    if (command == _("#checkable")) {
	// checking/selecting of the item (non-exclusive)
	setCheckable(true);
    }
    else if (parser.command() == _("#exclusive")) {
	// join to a list of groups
	QString group = parser.firstParam();
	while (group.length()) {
	    if (!m_exclusive_group.length()) {
		m_exclusive_group = group;
		joinGroup(group, Kwave::MenuGroup::EXCLUSIVE);
	    } else if (m_exclusive_group != group) {
		qWarning("menu item '%s' already member of "
			"exclusive group '%s'",
			DBG(name()), DBG(m_exclusive_group));
	    }
	    group = parser.nextParam();
	}

	// make the item checkable
	setCheckable(true);
	return true;
    }
    else if (command == _("#hidden")) {
	setVisible(false);
    }

    return (Kwave::MenuNode::specialCommand(command));
}
Exemple #2
0
int SocketUDP::openAsReceiver(const string& ip, int port, bool blocking)
{
    int r;

    _leaveGroup = false;

    r = _ip.setString(ip);
    if (r != E_OK)
        return r;

    r = open(_family, _type, _protocol);
    if (r != E_OK)
        return r;

    r = bind(port);
    if (r != E_OK)
        return r;

    if (_ip.getType() == IPv4::TYPE_MULTICAST) {
        r = joinGroup(_ip);
        if (r != E_OK)
            return r;
        _igmpSender.start(_ip);
        _leaveGroup = true;
    }

    r = setblocking(blocking);
    if (r != E_OK)
        return r;

    return E_OK;
}
void clientMessageHandle(int client_sock,string message){
	vector<string> choppedString;
	stringChopper(message,choppedString);
	if (choppedString[0].compare("LIN") == 0){
		userLogin(client_sock,choppedString);
	}
	else if (choppedString[0].compare("LOU") == 0){
		userLogout(client_sock,choppedString);
	}
	else if (choppedString[0].compare("REG") == 0){
		userRegister(client_sock,choppedString);
	} 
	else if (choppedString[0].compare("MSG") == 0){
		sendMessage(client_sock,choppedString);
	}
	else if (choppedString[0].compare("CGR") == 0){
		createGroup(client_sock,choppedString);
	} 
	else if (choppedString[0].compare("JGR") == 0){
		joinGroup(client_sock,choppedString);
	}
	else if (choppedString[0].compare("LGR") == 0){
		leaveGroup(client_sock,choppedString);
	}
	else{
		errorReply(client_sock,"000","Protocol error!");
	}
}
Exemple #4
0
bool Discovery::initMulticast(int port)
{
    const char *mcastaddr = "ff02::1"; // "FF01:0:0:0:0:0:0:1"; // all nodes // "FF01::1111";
	//const char *mcastaddr = "FF01:0:0:0:0:0:0:1";
	//const char *mcastaddr = "FF01::1111";

	memset(&m_multicastAddrBind, 0, sizeof(m_multicastAddrBind));
	memset(&m_multicastAddrSend, 0, sizeof(m_multicastAddrSend));


    if (get_multicast_addrs(mcastaddr, std::to_string(port).c_str(), SOCK_DGRAM, &m_multicastAddrBind, &m_multicastAddrSend) <0)
	{
		LOG(logERROR) << "get_addr error:: could not find multicast "
			<< "address=[" << mcastaddr << "] port=[" << port << " ]";
		return false;
	}
	

	if (!isMulticast(&m_multicastAddrSend)) {
		LOG(logERROR) << "This address does not seem a multicast address " << m_multicastAddrSend;
		return false;
	}

	m_socMulticast = socket(m_multicastAddrBind.ss_family, SOCK_DGRAM, 0);

    if (!socketSetBlocking(m_socMulticast, false))
        return false;


	/*if (bind(m_socMulticast, (struct sockaddr *)&m_multicastAddrBind, sizeof(m_multicastAddrBind)) < 0) {
		LOG(logERROR) << "bind error on port " << port;
		return false;
	}

	LOG(logDEBUG) << "bound multicast socket to " << m_multicastAddrBind;
	*/

	if (joinGroup(m_socMulticast, 0, 8, &m_multicastAddrSend) <0) {
		LOG(logERROR) << "failed to join multicast group!";
		return false;
	}
	
	return true;
}
Exemple #5
0
MulticastServer::MulticastServer(char *multicastGroup, in_addr_t sourceMulticastIp, unsigned short port, HashTable *_keyHashtable, KeyHashtableTimeout *_keyHashtableTimeout) : Server(SOCK_DGRAM, IPPROTO_IP, port) {
	int returnCode;
	struct in_addr interfaceIp;
	char delimiter[2];

	interfaceIp.s_addr = sourceMulticastIp;
	multicastServerInitialized = false;
		
	returnCode = joinGroup(multicastGroup, &interfaceIp);
	if (returnCode < 0) {
		systemLog->sysLog(ERROR, "cannot initialized MulticastServer correctly");
		return;
	}
	returnCode = setTTL(255);
	if (returnCode < 0) {
		systemLog->sysLog(ERROR, "cannot initialized MulticastServer correctly");
		return;
	}
	delimiter[0] = '\n';
	delimiter[1] = '\0';
	parser = new Parser(delimiter);
	if (! parser) {
		systemLog->sysLog(CRITICAL, "cannot create a Parser object: %s", strerror(errno));
		return;
	}
	keyHashtable = _keyHashtable;
	keyHashtableTimeout = _keyHashtableTimeout;

	/* construct a multicast address structure */
	struct sockaddr_in mc_addr;
	memset(&mc_addr, 0, sizeof(mc_addr));
	mc_addr.sin_family = AF_INET;
	mc_addr.sin_addr.s_addr = inet_addr(multicastGroup);
	mc_addr.sin_port = htons(port);

	if (bind(sd, (struct sockaddr*) &mc_addr, sizeof(mc_addr)) == -1) {
	  systemLog->sysLog(ERROR, "cannot bind multicast adress: %s\n", strerror(errno));
	  return;
	}

	multicastServerInitialized = true;
	
	return;
}
void CreateUdpSocket()
{
		sprintf(bufip,"%d.%d.%d.%d",x1,x2,x3,x4);
		Multicastip = bufip;
		udp_server.sin_family=AF_INET;
		udp_server.sin_addr.s_addr=inet_addr(Multicastip);
		udp_server.sin_port=htons(px);
		//getSharedMem();	
        udp_socket_fd= socket(AF_INET,SOCK_DGRAM,0);
		if (udp_socket_fd<0) {
			perror("opening datagram socket");
			exit(-1);
			}
		reusePort(udp_socket_fd);	
		
		if ( bind( udp_socket_fd, (SA *) &udp_server, sizeof(udp_server) ) < 0 ) {
		close(udp_socket_fd);
		perror("binding name to datagram socket");
		exit(-1);
		}
		joinGroup(udp_socket_fd, Multicastip);
}
Exemple #7
0
int Multicast_send_socket (const char *hostname, const char *listenport, int family, 
		unsigned int wmem_size, struct sockaddr_storage *addr, int *addrlen) {
struct addrinfo hints, *res, *ressave;
int error, sockfd;

	if ( !listenport || !hostname ) {
        fprintf(stderr, "hostname and listen port required!\n");
        syslog(LOG_ERR, "hostname and listen port required!\n");
		return -1;
	}

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family 	= family;
    hints.ai_socktype 	= SOCK_DGRAM;

    error = getaddrinfo(hostname, listenport, &hints, &res);

    if ( error ) {
        fprintf(stderr, "getaddrinfo error:: [%s]\n", gai_strerror(error));
        syslog(LOG_ERR, "getaddrinfo error:: [%s]\n", gai_strerror(error));
        return -1;
    }


    /* 
       Try open socket with each address getaddrinfo returned, 
       until we get a valid listening socket. 
    */

    sockfd=-1;
    ressave = res;
    while (res) {
        sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
        if ( sockfd < 0 ) {
        	res=res->ai_next;
			continue;
		}

		// we found a valid socket and are done in this loop
		break;
	}

	if ( sockfd < 0 ) {
		// nothing found - bye bye
		fprintf(stderr, "Could not create a socket for [%s:%s]\n", hostname, listenport);
        syslog(LOG_ERR, "Could not create a socket for [%s:%s]\n", hostname, listenport);
		freeaddrinfo(ressave);
		return -1;
	}

	if ( isMulticast((struct sockaddr_storage *)res->ai_addr) < 0 ) {
		fprintf(stderr, "Not a multicast address [%s]\n", hostname);
        syslog(LOG_ERR, "Not a multicast address [%s]\n", hostname);
		freeaddrinfo(ressave);
		return -1;
	}

	close(sockfd);
	sockfd = socket(res->ai_family, SOCK_DGRAM, 0);

	*addrlen = res->ai_addrlen;
	memcpy(addr, res->ai_addr, res->ai_addrlen);

/*
     ((struct sockaddr_in *)addr)->sin_family=AF_INET;
     addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);
     addr.sin_port=htons(HELLO_PORT);
*/

	if (joinGroup(sockfd, 1 , 1, (struct sockaddr_storage *)res->ai_addr) <0) {
		close(sockfd);
		freeaddrinfo(ressave);
		return -1;
	}

    freeaddrinfo(ressave);

/*
	message = "hello world\n";
     printf("Send %lu bytes, Message: %s\n", strlen(message)+1, message);
     while (1) {
      ret = sendto(sockfd,message,strlen(message)+1,0,(struct sockaddr *) addr, *addrlen);
      if ( ret != strlen(message)+1 ) {
           perror("sendto");
           exit(1);
      }
		printf("sleep\n");
      sleep(1);
     }
exit(255);
*/
    return sockfd;

} /* End of Multicast_send_socket */
Exemple #8
0
int Multicast_receive_socket (const char *hostname, const char *listenport, int family, int sockbuflen ) {
struct addrinfo hints, *res, *ressave;
socklen_t   	optlen;
int p, error, sockfd;

	if ( !listenport ) {
        fprintf(stderr, "listen port required!\n");
        syslog(LOG_ERR, "listen port required!\n");
		return -1;
	}

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family 	= family;
    hints.ai_socktype	= SOCK_DGRAM;

    error = getaddrinfo(hostname, listenport, &hints, &res);

    if ( error ) {
        fprintf(stderr, "getaddrinfo error:: [%s]\n", gai_strerror(error));
        syslog(LOG_ERR, "getaddrinfo error:: [%s]\n", gai_strerror(error));
        return -1;
    }


    /* 
       Try open socket with each address getaddrinfo returned, 
       until we get a valid listening socket. 
    */

    sockfd	= -1;
    ressave = res;
    while (res) {
        sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
        if ( sockfd < 0 ) {
        	res=res->ai_next;
			continue;
		}

		// we found a valid socket and are done in this loop
		break;
	}

	if ( sockfd < 0 ) {
		// nothing found - bye bye
		fprintf(stderr, "Could not create a socket for [%s:%s]\n", hostname, listenport);
        syslog(LOG_ERR, "Could not create a socket for [%s:%s]\n", hostname, listenport);
		freeaddrinfo(ressave);
		return -1;
	}


	if ( isMulticast((struct sockaddr_storage *)res->ai_addr) < 0 ) {
		fprintf(stderr, "Not a multicast address [%s]\n", hostname);
        syslog(LOG_ERR, "Not a multicast address [%s]\n", hostname);
		freeaddrinfo(ressave);
		return -1;
	}

	close(sockfd);


	sockfd = socket(res->ai_family, SOCK_DGRAM, 0);
	if (bind(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
		fprintf(stderr, "bind: %s\n", strerror (errno));
        syslog(LOG_ERR, "bind: %s\n", strerror (errno));
		close(sockfd);
		freeaddrinfo(ressave);
		return -1;
	}

	if (joinGroup(sockfd, 1 , 1, (struct sockaddr_storage *)res->ai_addr) <0) {
		close(sockfd);
		freeaddrinfo(ressave);
		return -1;
	}

	if ( res->ai_family == AF_INET ) 
   		syslog(LOG_DEBUG, "Joined IPv4 multicast group: %s Port: %s", hostname, listenport);
	if ( res->ai_family == AF_INET6 ) 
   		syslog(LOG_DEBUG, "Joined IPv6 multicat group: %s Port: %s", hostname, listenport);


    freeaddrinfo(ressave);

	if ( sockbuflen ) {
		if ( sockbuflen < Min_SOCKBUFF_LEN ) {
			sockbuflen = Min_SOCKBUFF_LEN;
			syslog(LOG_INFO,"I want at least %i bytes as socket buffer", sockbuflen);
		}
		optlen = sizeof(p);
		getsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&p,&optlen);
		syslog(LOG_INFO,"Standard setsockopt, SO_RCVBUF is %i Requested length is %i bytes",p, sockbuflen);
		if ((setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &sockbuflen, sizeof(sockbuflen)) != 0) ) {
			fprintf (stderr, "setsockopt(SO_RCVBUF,%d): %s\n", sockbuflen, strerror (errno));
			syslog (LOG_ERR, "setsockopt(SO_RCVBUF,%d): %s", sockbuflen, strerror (errno));
			close(sockfd);
			return -1;
		} else {
			getsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&p,&optlen);
			syslog(LOG_INFO,"System set setsockopt, SO_RCVBUF to %d bytes", p);
		}
	} 

    return sockfd;

} /* End of Multicast_receive_socket */
Exemple #9
0
void MulticastSocket::joinGroup(const IPAddress& groupAddress)
{
	NetworkInterface intf;
	joinGroup(groupAddress, intf);
}
Exemple #10
0
main(int argc, char *argv[])
{

	//checking the arguments 
	if (argc != 4 || argc == 2 ) 
	{
		printf("Usage: ChatClient <shost> <sport> <u/m>\n");
		printf("e.g.: ChatClient atria 10123 u \n");
		exit(1);
	}
  	if  ( (hp = gethostbyname(argv[1])) == NULL ) {
    		addr.sin_addr.s_addr = inet_addr(argv[1]);
    		if ((hp = gethostbyaddr((char *) &addr.sin_addr.s_addr,
       		sizeof(addr.sin_addr.s_addr),AF_INET)) == NULL) {
      			fprintf(stderr, "Can't find host %s\n", argv[1]);
      			exit(-1);
    		}
  	}
  	printf("\n>> UMChatServer :\t %s\n", hp->h_name);
  	bcopy ( hp->h_addr, &(server.sin_addr), hp->h_length);
  	printf(">> UMChatServer IP:\t %s \n", inet_ntoa(server.sin_addr));

  	server.sin_family = AF_INET;
  	server.sin_port = htons(atoi(argv[2]));
  	sd = socket (AF_INET,SOCK_STREAM,0);


	if ( connect(sd, (SA *) &server, sizeof(server)) < 0 ) {
    		close(sd);
    		perror("connecting to server socket");
    		exit(0);
	}


	length = sizeof(client);
	if ( getsockname (sd, (SA *)&client,&length) ) {
		perror("getting socket name");
		exit(0);
  	}
    
	TCPPort = ntohs(client.sin_port);
	userName=getlogin();
	
	if(strcmp(argv[3],"m" )== 0)	
	{
		//send logic
		char octet='0';
		
		sprintf(buf, "%c", octet);
		sprintf(userBuf, "%s", userName);
		if (send(sd,userBuf, sizeof(userBuf), 0) <0 )
			perror("sending user name");
		usleep(1000);
		if (send(sd,buf , sizeof(buf), 0) <0 )
			perror("sending MIP message");
			
		
		
	}
	if(strcmp(argv[3],"u" )== 0)	
	{
		//send logic
		char octet='1';
		sprintf(buf, "%c", octet);
		sprintf(userBuf, "%s", userName);
		if (send(sd,userBuf, sizeof(userBuf), 0) <0 )
			perror("sending user name");
			usleep(1000);
		if (send(sd,buf , sizeof(buf), 0) <0 )
			perror("sending MIP message");
		
		
	
	}
	

	printf(">> ChatClient TCP Port:\t %d\n", TCPPort);

	//multicast
	if(strcmp(argv[3],"m" )== 0)
	{
    	if( (rc=recv(sd, MIP, sizeof(MIP), 0)) < 0){
      		perror("receiving MIP  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		MIP[rc]='\0';
      		printf(">> MCAST IP:\t %s", MIP);
    	}

    	if( (rc=recv(sd, MPort, sizeof(MPort), 0)) < 0){
      		perror("receiving MPort  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		MPort[rc]='\0';
      		printf(">> MCAST Port:\t %s\n", MPort);
    	}
		
		if( (rc=recv(sd, listNumber, sizeof(listNumber), 0)) < 0){
      		perror("receiving list  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		listNumber[rc]='\0';
      		printf(">> LIST Code:\t %s\n", listNumber);
    	}
		
		if( (rc=recv(sd, exitNumber, sizeof(exitNumber), 0)) < 0){
      		perror("receiving exit  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		exitNumber[rc]='\0';
      		printf(">> END Code:\t %s\n", exitNumber);
    	}
		//multicast
		
		MulticastIPAddress = MIP;
		UDPPort = htons(atoi( MPort ) );

		LocalHostR.sin_family = AF_INET;
		LocalHostR.sin_port = UDPPort;
		LocalHostR.sin_addr.s_addr = htonl(INADDR_ANY);


		if ((UDPsocketR = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
			printf("can't create UDP socket R: \n");
			exit(-1);
		}
		reusePort(UDPsocketR);

		if (bind(UDPsocketR, (SA *) & LocalHostR, sizeof(LocalHostR)) < 0) {
			printf("error in bind R\n");
			exit(-1);
		}
		
		LocalHostS.sin_family = AF_INET;
		LocalHostS.sin_port =  htons(TCPPort);
		LocalHostS.sin_addr.s_addr = htonl(INADDR_ANY);

		if ((UDPsocketS = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
			printf("can't create UDP socket S: \n");
			exit(-1);
		}

		if (bind(UDPsocketS, (SA *) & LocalHostS, sizeof(LocalHostS)) < 0) {
			printf("error in bind S\n");
			exit(-1);
		}


		TimeToLive = 2;
		setTTLvalue(UDPsocketR, &TimeToLive);

		loop = 1;		/* enable loopback */
		setLoopback(UDPsocketR, loop);

		joinGroup(UDPsocketR, MIP);

			
		signal( SIGQUIT, QUIThandler );

		if (fork() == 0)
		sendMessage(0, UDPsocketS);
		getMessage(UDPsocketR, 1);
		
		
	}
	//unicast
	if(strcmp(argv[3],"u" )== 0)
	{
		if( (rc=recv(sd, MPort, sizeof(MPort), 0)) < 0){
      		perror("receiving MPort  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		MPort[rc]='\0';
      		printf(">> MCAST Port:\t %s\n", MPort);
    	}
		
		if( (rc=recv(sd, listNumber, sizeof(listNumber), 0)) < 0){
      		perror("receiving list  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		listNumber[rc]='\0';
      		printf(">> LIST Code:\t %s\n", listNumber);
    	}
		
		if( (rc=recv(sd, exitNumber, sizeof(exitNumber), 0)) < 0){
      		perror("receiving exit  message");
      		exit(-1);
    	}
    	if (rc > 0){
      		exitNumber[rc]='\0';
      		printf(">> END Code:\t %s\n", exitNumber);
    	}
		//creates udp socket
		UDPPort = htons(atoi( MPort ) );
		
		LocalHostS.sin_family = AF_INET;
		LocalHostS.sin_port =UDPPort;
		LocalHostS.sin_addr.s_addr = htonl(INADDR_ANY);

		if ((UDPsocketS = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
			printf("can't create UDP socket S: \n");
			exit(-1);
		}

		if (bind(UDPsocketS, (SA *) & LocalHostS, sizeof(LocalHostS)) < 0) {
			printf("error in bind S\n");
			exit(-1);
		}
		
		
		if (fork() == 0)
		sendMessage(0, UDPsocketS);
		getMessage(UDPsocketS, 1);
		
	}
	
}
Exemple #11
0
void GroupManager::inviteToGroup(CreatureObject* leader, CreatureObject* target) {
	// Pre: leader locked
	// Post: player invited to leader's group, leader locked

	Locker clocker(target, leader);

	if (target == leader) {
		leader->sendSystemMessage("@group:invite_no_target_self");
		return;
	}

	if (leader->isGrouped()) {
		ManagedReference<GroupObject*> group = leader->getGroup();

		if (playerIsInvitingOwnPet(leader, target)) {
			if (!target->isInRange(leader, 120)) {
				return;
			}
		}
		else if (group->getLeader() != leader) {
			leader->sendSystemMessage("@group:must_be_leader");
			return;
		}

		// can't invite if the group is full
		if (group->getGroupSize() >= 20) {
			leader->sendSystemMessage("@group:full");
			return;
		}
	}

	if (target->isGrouped()) {
		StringIdChatParameter stringId;
		stringId.setStringId("group", "already_grouped");
		stringId.setTT(target);
		leader->sendSystemMessage(stringId);
		//leader->sendSystemMessage("group", "already_grouped", player->getObjectID());

		return;
	}

	if (target->getGroupInviterID() == leader->getObjectID()) {
		StringIdChatParameter stringId;
		stringId.setStringId("group", "considering_your_group");
		stringId.setTT(target);
		leader->sendSystemMessage(stringId);
		//leader->sendSystemMessage("group", "considering_your_group", player->getObjectID());

		return;
	} else if (target->getGroupInviterID() != 0) {
		StringIdChatParameter stringId;
		stringId.setStringId("group", "considering_other_group"); // %TT is considering joining another group.
		stringId.setTT(target);
		leader->sendSystemMessage(stringId);

		return;
	}

	target->updateGroupInviterID(leader->getObjectID());

	StringIdChatParameter stringId;
	stringId.setStringId("group", "invite_leader");
	stringId.setTT(target->getDisplayedName());
	leader->sendSystemMessage(stringId);

	if (target->isPlayerCreature()) {
		stringId.setStringId("group", "invite_target");
		stringId.setTT(leader->getDisplayedName());
		target->sendSystemMessage(stringId);

	} else if (target->isPet()) {
		unsigned long long ownerId = target->getCreatureLinkID();
		ManagedReference<CreatureObject*> owner = target->getZoneServer()->getObject(ownerId).castTo<CreatureObject*>();

		if (owner != NULL && owner != leader)
			owner->sendSystemMessage("@pet/pet_menu:pet_invited"); // Your pet has been invited to join your group.

		joinGroup(target);
	}

}
Exemple #12
0
main(int argc, char *argv[])
{
	FD_SET(0, &full_fd);    
	
	if (argc != 4) {
		printf("Usage: ChatClient <host> <port> <m|u|s>\n");
		printf("e.g.: ChatClient atria 10123 u \n");
		exit(1);
	}

        if ((username = getlogin()) == NULL) perror("Who are you?\n");

  	if  ( (hp = gethostbyname(argv[1])) == NULL ) {
    		addr.sin_addr.s_addr = inet_addr(argv[1]);
    		if ((hp = gethostbyaddr((char *) &addr.sin_addr.s_addr,
       		sizeof(addr.sin_addr.s_addr),AF_INET)) == NULL) {
      			fprintf(stderr, "Can't find host %s\n", argv[1]);
      			exit(-1);
    		}
  	}
  	printf("\n UMChatServer --> %s\n", hp->h_name);

  	bcopy ( hp->h_addr, &(TCPserver.sin_addr), hp->h_length);
  	bcopy ( hp->h_addr, &(UDPserver.sin_addr), hp->h_length);
	bcopy ( hp->h_addr, &(SCTP_Qserver.sin_addr), hp->h_length);
  	printf(" UMChatServer IP: %s \n", inet_ntoa(TCPserver.sin_addr));

	SCTP_Qserver.sin_family = AF_INET; 
  	TCPserver.sin_family = AF_INET;
  	UDPserver.sin_family = AF_INET;
  	TCPserver.sin_port = htons(atoi(argv[2]));

	
        if (strcmp(argv[3], "s") == 0) TYPE=S;
        if (strcmp(argv[3], "m") == 0) TYPE=M;
		if (strcmp(argv[3], "u") == 0) TYPE=U;	    

if (TYPE == S)	    
{
	SCTPsocket = socket (AF_INET,SOCK_STREAM,IPPROTO_SCTP);	
	
		if ( connect(SCTPsocket, (SA *) &TCPserver, sizeof(TCPserver)) < 0 ) {
				close(SCTPsocket);
				perror("connecting to UMChatServer socket");
				exit(0);
		}

			if ( send(SCTPsocket, username, strlen(username), 0) < 0) 
				perror("send username message");

		length = sizeof(client);
		if ( getsockname (SCTPsocket, (SA *)&client,&length) ) {
			perror("getting socket name");
			exit(0);
		}
			SCTPPort = ntohs(client.sin_port);	
}
else    
	{
		TCP_socket = socket (AF_INET,SOCK_STREAM,0);
		if ( connect(TCP_socket, (SA *) &TCPserver, sizeof(TCPserver)) < 0 ) {
				close(TCP_socket);
				perror("connecting to UMChatServer socket.....");
				exit(0);
		}

			if ( send(TCP_socket, username, strlen(username), 0) < 0) 
				perror("send username message");

		length = sizeof(client);
		if ( getsockname (TCP_socket, (SA *)&client,&length) ) {
			perror("getting socket name");
			exit(0);
		}
			TCPPort = ntohs(client.sin_port);
	}


	if (TYPE == M) 
	{
       		if ( send(TCP_socket, MChat, strlen(MChat), 0) < 0) 
			perror("send MChat  message");
	        if( (rc=recv(TCP_socket, MIP, sizeof(MIP), 0)) < 0) 
			perror("receiving MIP  message");
        	if (rc > 0)
			{
               		MIP[rc]='\0';
                	printf("THE MCAST IP --> %s", MIP);
        	}
    }
	if (TYPE == U)     
	{
		if ( send(TCP_socket, UChat, strlen(UChat), 0) < 0)  
			perror("send UChat  message");
    }
	if (TYPE == S)    
	{
		if( (rc=recv(SCTPsocket, MPort, sizeof(MPort), 0)) < 0) 	
			perror("receiving MPort message 01");
		if (rc > 0)
		{
			MPort[rc]='\0';
			printf(" THE MCAST Port --> %s\n", MPort);
		}
			strcat(record,inet_ntoa(SCTP_Qserver.sin_addr));
		strcat(record,":");
		strcat(record,MPort);
			sprintf(ServerAddr, "[%s] ", record);
		UDPPort = htons(atoi( MPort ) );
		SCTP_Qserver.sin_port = UDPPort;

			if( (rc=recv(SCTPsocket, RandomCODE1, sizeof(RandomCODE1), 0)) < 0) 
			perror("receiving RandomCODE1  message");
			if (rc > 0){
				RandomCODE1[rc]='\0';
				printf(" THE LIST Code --> %s\n", RandomCODE1);
			}

			if( (rc=recv(SCTPsocket, RandomCODE2, sizeof(RandomCODE2), 0)) < 0) 
			perror("receiving RandomCODE2  message");
			if (rc > 0){
				RandomCODE2[rc]='\0';
				printf("THE END Code --> %s\n\n", RandomCODE2);
			}		
	}
	else    
	{
		if( (rc=recv(TCP_socket, MPort, sizeof(MPort), 0)) < 0) 	
			perror("receiving MPort  message");
		if (rc > 0)
		{ 
			MPort[rc]='\0';
			printf(" THE MCAST Port --> %s\n", MPort);
		}
			strcat(record,inet_ntoa(UDPserver.sin_addr));
		strcat(record,":");
		strcat(record,MPort);
			sprintf(ServerAddr, "[%s] ", record);
		UDPPort = htons(atoi( MPort ) );
		UDPserver.sin_port = UDPPort;

			if( (rc=recv(TCP_socket, RandomCODE1, sizeof(RandomCODE1), 0)) < 0) 
			perror("receiving RandomCODE1  message");
			if (rc > 0){
				RandomCODE1[rc]='\0';
				printf(" THE LIST Code --> %s\n", RandomCODE1);
			}

			if( (rc=recv(TCP_socket, RandomCODE2, sizeof(RandomCODE2), 0)) < 0) 
			perror("receiving RandomCODE2  message");
			if (rc > 0){
				RandomCODE2[rc]='\0';
				printf(" THE END Code --> %s\n\n", RandomCODE2);
			}
	}
		
	LocalHostUS.sin_family = AF_INET;
	LocalHostUS.sin_port =  htons(TCPPort);
	LocalHostUS.sin_addr.s_addr = htonl(INADDR_ANY);
	
	    
	LocalHostSCTP_Q.sin_family = AF_INET;
	LocalHostSCTP_Q.sin_port =  htons(client.sin_port)+1;
	LocalHostSCTP_Q.sin_addr.s_addr = htonl(INADDR_ANY);	

		    
        MulticastIPAddress = MIP;
        UDPPort = htons(atoi( MPort ) );
        LocalHostUR.sin_family = AF_INET;
        LocalHostUR.sin_port = UDPPort;
        LocalHostUR.sin_addr.s_addr = htonl(INADDR_ANY);

        GroupAddress.sin_family = AF_INET;
        GroupAddress.sin_port = UDPPort;
        GroupAddress.sin_addr.s_addr = inet_addr(MulticastIPAddress);

	if ((UDPsocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
		perror("can't create UDP socket S: \n");
	if (bind(UDPsocket, (SA *) & LocalHostUS, sizeof(LocalHostUS)) < 0) printf("error in bind UDP S\n");
	
	FD_SET(UDPsocket, &full_fd);
	
	    
	if ((SCTP_Qsocket = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) 
		perror("can't create SCTP-Q socket S: \n");
		
	reusePort(SCTP_Qsocket);		
	
	if (bind(SCTP_Qsocket, (SA *) & LocalHostSCTP_Q, sizeof(LocalHostSCTP_Q)) < 0) printf("error in bind SCTP_Q S\n");
	
	FD_SET(SCTP_Qsocket, &full_fd);
	
	
	if (TYPE == M) {
        	if ((MCASTsocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
			perror("can't create UDP MCASTsocket R: \n");
        	reusePort(MCASTsocket);
        	if (bind(MCASTsocket, (SA *) & LocalHostUR, sizeof(LocalHostUR)) < 0)  
			perror("error in bind R\n");
        	joinGroup(MCASTsocket, MIP);
			
			FD_SET(MCASTsocket, &full_fd); 
	}
        TimeToLive = 2;
        setTTLvalue(UDPsocket, &TimeToLive);
        loop = 1;               
        setLoopback(UDPsocket, loop);
	 

	signal( SIGQUIT, QUIThandler );
	signal( SIGINT, INThandler);
	

        char            recvBuf[MAXLINE];
        int             bytes = 0;

        if (TYPE == U) {
		if (sendto(UDPsocket,EchoTest,strlen(EchoTest),0,(SA *)&UDPserver,sizeof(UDPserver)) < 0) 
			perror("error in sendto EchoTest UDPsocket \n");
	}
	
	    
        if (TYPE == S) {
		char EchoTest[100];
		strcpy(EchoTest,"WELCOME, New SCTP: ");
		
		strcat(EchoTest,username);
		strcat(EchoTest,"\n");
		
		
		if (sendto(SCTP_Qsocket,EchoTest,strlen(EchoTest),0,(SA *)&SCTP_Qserver,sizeof(SCTP_Qserver)) < 0) 
			perror("error in send to EchoTest SCTP_Qsocket \n");
	}	
        if (TYPE == M) {
		 if (sendto(UDPsocket,EchoTest,strlen(EchoTest),0,(SA *)&UDPserver,sizeof(UDPserver)) < 0) 
			 perror("error in send to EchoTest UDPsocket \n");
		if (sendto(MCASTsocket,EchoTest,strlen(EchoTest),0,(SA *)&UDPserver,sizeof(UDPserver)) < 0) 
			perror("error in send to EchoTest MCASTsocket \n");
                 if ( (bytes = recvfrom(UDPsocket, recvBuf, MAXLINE, 0, (SA *) &from, &fromlen) ) < 0)   
			 perror("error in rec from EchoTest UDPsocket \n");
	
	}	
	        sleep(1);
	
	selectHandle();
}