Example #1
0
/*! Receive a NetworkMessage. Workes like recv, but buffer and size is
    taken from the NetworkMessage
    \see Socket::recv
 */
int DgramSocket::recvFrom(NetworkMessage &msg,SocketAddress &from)
{
    NetworkMessage::Header hdr;
    peek(&hdr,sizeof(hdr));
    msg.setSize(osgntohl(hdr.size));
    return recvFrom(msg.getBuffer(),msg.getSize(),from);
}
Example #2
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;
}
Example #3
0
int Socket::recvFrom(uint8_t *buf, int &len, 
        struct sockaddr_un &addr, const int flags)
{
    if (-1 == m_fd) return EG_INVAL;

    socklen_t addrLen[1] = { sizeof(addr) };

    return recvFrom(buf, len, flags, 
            (struct sockaddr *)&addr, addrLen);
}
int Socket::recvFrom(std::string& data, int flags, InetAddress& sinaddr)const
{
    char buf[MAX_RECV_SIZE + 1] = { 0 };

    while(true)
    {
        int len = recvFrom(buf, MAX_RECV_SIZE, flags, sinaddr);
        if(len == -1 || len == 0)
            break;
        data.insert(data.end(), buf, buf + len);
        if(len < MAX_RECV_SIZE)
            break;
    }
    return data.size();
}
Example #5
0
int SocketWrapper::getMessageSize() 
{
    char b;    

    struct sockaddr saddr; 
    bzero(&saddr, sizeof(struct sockaddr));
    socklen_t addrlen = sizeof(struct sockaddr);

    ssize_t rc = recvFrom(&b, 1, MSG_PEEK | MSG_TRUNC, &saddr, &addrlen);

    if (0 >= rc) {
        HAGGLE_ERR("Error: could not peek on socket\n");
    }

    return rc;
}
Example #6
0
bool SocketWrapper::peek(struct sockaddr *o_saddr, socklen_t *o_addrlen) 
{
    if ((NULL == o_saddr) || (NULL == o_addrlen)) {
        HAGGLE_ERR("Invalid params\n");
        return false;
    }

    char b;
    ssize_t rc = recvFrom(&b, 1, MSG_PEEK, o_saddr, o_addrlen);

    if (1 != rc) {
        HAGGLE_ERR("Error: could not peek on socket\n");
        return false;
    }

    return true;
}
Example #7
0
int SocketWrapper::peek(char *o_buf, int buf_size) 
{
    if (NULL == o_buf) {
        HAGGLE_ERR("Invalid params\n");
        return 0;
    }

    struct sockaddr saddr; 
    bzero(&saddr, sizeof(struct sockaddr));
    socklen_t addrlen = sizeof(struct sockaddr);

    ssize_t rc = recvFrom(o_buf, buf_size, MSG_PEEK, &saddr, &addrlen);

    if (0 >= rc) {
        HAGGLE_ERR("Error: could not peek on socket\n");
    }

    return rc;
}
Example #8
0
ProtocolEvent ProtocolUDP::receiveData(void *buf, size_t buflen, struct sockaddr *peer_addr, const int flags, size_t *bytes)
{
	ssize_t ret;

	*bytes = 0;

	socklen_t addrlen = SOCKADDR_SIZE;

	memset(peer_addr, 0, SOCKADDR_SIZE);

	ret = recvFrom(buf, buflen, flags, peer_addr, &addrlen);

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

	*bytes = ret;

	return PROT_EVENT_SUCCESS;	
}
void
PeerDiscovery::DomainPeerDiscovery::listenerpack_thread()
{
    int stopfds_pipe[2];
#ifndef _WIN32
    if (pipe(stopfds_pipe) == -1)
        throw std::runtime_error(std::string("Can't open pipe: ") + strerror(errno));
#else
    net::udpPipe(stopfds_pipe);
#endif
    int stop_readfd = stopfds_pipe[0];
    stop_writefd_ = stopfds_pipe[1];

    while (true) {
        fd_set readfds;

        FD_ZERO(&readfds);
        FD_SET(stop_readfd, &readfds);
        FD_SET(sockfd_, &readfds);


        int data_coming = select(std::max(sockfd_, stop_readfd) + 1, &readfds, nullptr, nullptr, nullptr);

        {
            std::unique_lock<std::mutex> lck(dmtx_);
            if (not drunning_)
                break;
        }

        if (data_coming < 0) {
            if(errno != EINTR) {
                perror("Select Error");
                std::this_thread::sleep_for( std::chrono::seconds(1) );
            }
        } else if (data_coming > 0) {
            if (FD_ISSET(stop_readfd, &readfds)) {
                std::array<uint8_t, 64 * 1024> buf;
                recv(stop_readfd, (char*)buf.data(), buf.size(), 0);
            }

            try {
                auto rcv = recvFrom();
                msgpack::object obj = rcv.second.get();

                if (obj.type != msgpack::type::MAP)
                    continue;
                for (unsigned i = 0; i < obj.via.map.size; i++) {
                    auto& o = obj.via.map.ptr[i];
                    if (o.key.type != msgpack::type::STR)
                        continue;
                    auto key = o.key.as<std::string>();
                    ServiceDiscoveredCallback cb;
                    {
                        std::lock_guard<std::mutex> lck(dmtx_);
                        auto callback = callbackmap_.find(key);
                        if (callback != callbackmap_.end())
                            cb = callback->second;
                    }
                    if (cb)
                        cb(std::move(o.val), std::move(rcv.first));
                }
            } catch (const std::exception& e) {
                std::cerr << "Error receiving packet: " << e.what() << std::endl;
            }
        }
    }
    if (stop_readfd != -1)
        close(stop_readfd);
    if (stop_writefd_ != -1) {
        close(stop_writefd_);
        stop_writefd_ = -1;
    }
}
Example #10
0
int
main(void)
{
    int sockfd, new_fd;  // listen on sock_fd, new connection on new_fd
    struct addrinfo hints, *servinfo, *p;
    struct sockaddr_storage their_addr; // connector's address information
    socklen_t sin_size;
    struct sigaction sa;
    int yes=1;
    char s[INET6_ADDRSTRLEN];
    int rv;
	pid_t childPID; //control variable for multithreading
	//char send_buf[MAX_SEND_BUF_LENGTH];
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE; // use my IP
//For debugging
	FILE *file; 
	file = fopen("file_server.txt", "w");
	fprintf(file,"%s","Top of the file");
//

    if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
        return 1;
    }

    // loop through all the results and bind to the first we can
    for(p = servinfo; p != NULL; p = p->ai_next) {
        if ((sockfd = socket(p->ai_family, p->ai_socktype,
                p->ai_protocol)) == -1) {
            perror("server: socket");
            continue;
        }

        if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
                sizeof(int)) == -1) {
            perror("setsockopt");
            exit(1);
        }

        if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
            close(sockfd);
            perror("server: bind");
            continue;
        }

        break;
    }

    if (p == NULL)  {
        fprintf(stderr, "server: failed to bind\n");
        return 2;
    }

    freeaddrinfo(servinfo); // all done with this structure

    if (listen(sockfd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
    }

    sa.sa_handler = sigchld_handler; // reap all dead processes
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_RESTART;
    if (sigaction(SIGCHLD, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    printf("server: waiting for connections...\n");
    while(1) {  // main accept() loop
        sin_size = sizeof their_addr;
        new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
        if (new_fd == -1) {
            perror("accept");
            continue;
        }

        inet_ntop(their_addr.ss_family,
            get_in_addr((struct sockaddr *)&their_addr),
            s, sizeof s);

        printf("server: got connection from %s\n", s);
		//fprintf(file,"%s","server: got connection from");
		//fprintf(file,"%s\n",s);
		//Threading
		childPID=fork();
		if(childPID>=0)
		{
			if(childPID == 0){ //Child process
				close(sockfd); // child doesn't need the listener
				//Send "WDW?"; What do you want?
				sendTo(new_fd, "WDW?");
				recvFrom(new_fd);
				nofChunksToSend=atoi(recv_buf);
				//send the bulk data to the client
				unsigned int nof_chunksent=0;
				while(nof_chunksent < nofChunksToSend){
					strcpy(send_buf, "Hello World birader");
					sprintf(temp_buffer, "%d", nof_chunksent);
					strcat(send_buf, temp_buffer);
					//printf("send_buf: %s\n", send_buf);
					//send send_buf to receiver
					if (sendTo(new_fd, send_buf) == 1){
						++nof_chunksent;
					}
					memset(send_buf, 0, MAXSENDLENGTH);//Initialize for the next chunk sending session
					memset(temp_buffer, 0, 10);
				}//All bulk data sent, close the socket
			    close(new_fd);
				fclose(file);
				exit(0);
			}
			else{//parent process
				close(new_fd);  // parent doesn't need this
				//Listen the channel by inf while
			}
		}
		else{
			printf("\n Fork failed, exit !\n");
	        return 1;
		}

	}
	fclose(file); /*done!*/ 

    return 0;
}
Example #11
0
void client_recv(int event_fd, Peer *peer)
{

	unsigned char headerBuf[HEADERSIZE*5];
	unsigned char dataBuf[DATASIZE*5];
	unsigned char sendBuf[DATASIZE*5];
	char *tokenBuf[DATASIZE];

	int len;

	memset(headerBuf, 0x00, HEADERSIZE*5);
	memset(dataBuf, 0x00, DATASIZE*5);
	memset(tokenBuf, 0x00, DATASIZE);

	Peer t_peer;
	t_peer.socket = event_fd;

	len = recvFrom(&t_peer, headerBuf, dataBuf);
	int type = byteToInt(headerBuf, 0);

	if(len > 0 )
	{
		/* 조회 */

		// who(id), when(time), where(ip), what(packet), how(to Inner Server, to Outer Client), why(type:purpose)
		log_line_init();

		log_user_name (event_fd, peer);
		//log_user_ip   (event_fd, peer);
		//log_user_ptype(type);

		log_line_feed();

		/* Nonce, Timestapm 저장 */
		/*
		   addNonce(con, tokenBuf[index-1]);
		   addNonce(con, tokenBuf[index]);
		 */
		/*
		   int i;0
		   for(i=0; i<index-1; i++)
		   {
		   strcat(sendBuf, tokenBuf[i]);
		   strcat(sendBuf, tokenBuf
		   }
		 */
	}
	if( len < 0 || len == 0 )
	{
		userpool_delete(event_fd, peer);
		close(event_fd);
		return;
	}

	switch(type)
	{
		case ERROR_REPORT :
			{
				// Auth, dir, HDFS Error Reporting Packet Protocol
				Peer client;
				client.socket = byteToInt(headerBuf, 4);

				/* 로그를 기록하는 부분 XML형태로 */
				sendTo(&client, 0, g_epoll_auth ,strlen((char *)dataBuf), dataBuf);
				break;

			}

		case LOGIN_REQUEST :
			{
				if(g_epoll_auth == 0)
				{
					printf("auth server not running \n");
					break;
				}
				Peer auth;
				auth.socket = g_epoll_auth;	
				len = sendTo(&auth, 1, event_fd, strlen((char *) dataBuf), dataBuf);

				break;
			}
		case LOGIN_RESPONSE :
			{
				char id_buf[20];
				Peer client;

				memset(id_buf, 0x00, 20);
				client.socket = byteToInt(headerBuf, 4);

				/* Align User to Admin Table */
				get_id_from_data(dataBuf, id_buf, strlen(dataBuf));
				userpool_add_name(client.socket, peer ,id_buf);
				printf("id : %s\n", id_buf);
				sendTo(&client, 2, g_epoll_auth ,strlen((char *) dataBuf), dataBuf);
				//userpool_add(client.socket, client.ip,

				break;
			}
		case LOGOUT_REQUEST :
			{
				Peer client;
				client.socket = event_fd;

				sendTo(&client, 4, event_fd, strlen((char *) dataBuf), dataBuf);
				userpool_delete(client.socket, peer);
				//close(client.socket);
				printf("delete\n");
				break;
			}

		case LOGOUT_RESPONSE :
			{
				/* This is not Server Responsibility */	
			}

		case SIGNUP_REQUEST :
			{
				Peer auth;
				auth.socket = g_epoll_auth;

				if(g_epoll_auth == 0)
				{
					//Exception
					printf("auth server not running \n");
					break;
				}	

				sendTo(&auth, 5, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case SIGNUP_RESPONSE :
			{
				Peer client;
				client.socket = byteToInt(headerBuf, 4);
				sendTo(&client, 6, g_epoll_dir ,strlen((char *) dataBuf), dataBuf);
				break;

			}

		case DIR_LIST_REQUEST :
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}
				sendTo(&dirServ, 7, event_fd, strlen((char *) dataBuf), dataBuf);
			}

		case DIR_LIST_RESPONSE :
			{
				Peer client;
				client.socket = byteToInt(headerBuf, 4);

				sendTo(&client, 8, event_fd, strlen((char *) dataBuf), dataBuf);	
				break;
			}

		case DIR_CREAT_REQUEST:
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				sendTo(&dirServ, 9, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case DIR_KEY_RESPONSE:
			{
				Peer peer;
				peer.socket = byteToInt(headerBuf, 4);
				sendTo(&peer, 10, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case ACCESS_DIR_REQUEST:
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				sendTo(&dirServ, 11, event_fd, strlen((char *) dataBuf), dataBuf);
				break;

			}

		case ACCESS_DIR_RESPONSE:
			{
				Peer peer;
				peer.socket = byteToInt(headerBuf, 4);
				sendTo(&peer, 12, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case FOLDER_CREAT_REQUEST:
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				sendTo(&dirServ, 13, event_fd, strlen((char *) dataBuf), dataBuf);
				break;	
			}

		case FOLDER_CREAT_RESPONSE:
			{
				Peer peer;
				peer.socket = byteToInt(headerBuf, 4);
				sendTo(&peer, 14, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case META_UPLOAD_REQUEST:
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 15, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case META_UPLOAD_RESPONSE:
			{
				Peer peer;
				peer.socket = byteToInt(headerBuf, 4);
				sendTo(&peer, 16, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}


		case META_DOWNLOAD_REQUEST:
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 17, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case META_DOWNLOAD_RESPONSE:
			{
				Peer peer;
				peer.socket = byteToInt(headerBuf, 4);
				sendTo(&peer, 18, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case SHARE_REQUEST:
			{
				/* Client to Dir */
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 21, event_fd, strlen((char *) dataBuf), dataBuf);

				break;
			}

		case 22:
			{
				/* Dir to Client */
				Peer peer;
				peer.socket = byteToInt(headerBuf, 4);
				sendTo(&peer, 22, event_fd, strlen((char *) dataBuf), dataBuf);
				
				break;

			}
	
		case SHARE_LIST_REQUEST:
			{
				/* Client to Dir */
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 23, event_fd, strlen((char *) dataBuf), dataBuf);

				break;
			}

		case SHARE_LIST_RESPONSE:
			{
				/* Dir to Client */
				Peer peer;
				peer.socket = byteToInt(headerBuf, 4);
				sendTo(&peer, 24, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}



		case SHARE_APPROVE:
			{
				/* Client to Dir */
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 25, event_fd, strlen((char *) dataBuf), dataBuf);

				break;
			}

		case SHARE_DENY:
			{

				/* Client to Dir */
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 26, event_fd, strlen((char *) dataBuf), dataBuf);
				printf("Share refuse Send!!!!!!!!!!!\n");

				break;
			}

		case SHARE_CANCEL:
			{

				/* Client to Dir */
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 27, event_fd, strlen((char *) dataBuf), dataBuf);

				break;
			}

			/* Transmit 프로토콜 30~49 */
		case DIR_TO_HDFS_FOR_UPLOAD_METADATA:
			{

				Peer hdfs;
				hdfs.socket = g_epoll_HDFS;


				if(g_epoll_HDFS == 0)
				{
					printf("HDFS server not running \n");
					break;
				}

				sendTo(&hdfs, 30, event_fd, strlen((char *) dataBuf), dataBuf);

				break;
			}

			/* 메타데이터 패쓰의 설정을 위해 사용 */
		case HDFS_TO_DIR_FOR_MODIFY_METAPATH:
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				sendTo(&dirServ, 31, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case DIR_TO_HDFS_FOR_DOWNLOAD_METADATA:
			{
				Peer hdfs;
				hdfs.socket = g_epoll_HDFS;


				if(g_epoll_HDFS == 0)
				{
					printf("HDFS server not running \n");
					break;
				}

				sendTo(&hdfs, 32, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

		case HDFS_TO_DIR_FOR_SEND_METADATA:
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				sendTo(&dirServ, 33, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}


			/* passingServ 프로토콜 50~100 */
		case PROGRAM_EXIT_REQUEST:
			{
				Peer client;
				client.socket = event_fd;

				sendTo(&client, PROGRAM_EXIT_RESPONSE, event_fd, strlen((char *) dataBuf), dataBuf);

				userpool_delete(event_fd, peer);
				close(client.socket);

				break;
			}

		case IDCHECK_REQUEST:
			{
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 19, event_fd, strlen((char *) dataBuf), dataBuf);
				break;

			}

		case IDCHECK_RESPONSE:
			{
				Peer peer;
				peer.socket = byteToInt(headerBuf, 4);
				sendTo(&peer, 20, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
	
			}

		/***********************************/
		/* 파일 및 폴더 삭제 관련 프로토콜 */
		/***********************************/
		
		case DEL_DIR_REQUEST:
			{
				/* Client to Dir */
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 28, event_fd, strlen((char *) dataBuf), dataBuf);

				break;
			}

		case DEL_FILE_REQUEST:
			{
				/* Client to Dir */
				Peer dirServ;
				dirServ.socket = g_epoll_dir;

				if(g_epoll_dir == 0)
				{
					printf("dir server not running \n");
					break;
				}

				/* event fd 클라이언트 소켓 디스크립터 번호 */
				sendTo(&dirServ, 29, event_fd, strlen((char *) dataBuf), dataBuf);

				break;
			}

		/***********************************/
		/* 인증 서버 접속관련 프로토콜     */
		/***********************************/
	


		case AUTH_BINDING :
			{
				if(g_epoll_auth == 0)
					printf("Auth Serv Binding \n");
				else{
					printf("Auth Serv already Binding \n");
					break;
				}

				g_epoll_auth = event_fd;
				Peer auth;
				auth.socket = g_epoll_auth;

				sendTo(&auth, 104, event_fd , strlen((char *) dataBuf), dataBuf);

				printf("Auth Serv Binding End \n");
				break;
			}

		case DIR_BINDING :
			{

				if(g_epoll_dir == 0)
					printf("Dir Serv Binding \n");
				else
				{
					printf("Dir Serv already Binding \n");
					break;
				}

				g_epoll_dir = event_fd;
				Peer dir;
				dir.socket = g_epoll_dir;


				sendTo(&dir, 105, event_fd, strlen((char *)dataBuf), dataBuf);

				printf("Dir Serv Binding End \n");
				break;
			}

		case HDFS_BINDING :
			{

				g_epoll_HDFS = event_fd;
				Peer HDFS;
				HDFS.socket = g_epoll_HDFS;


				sendTo(&HDFS, 106, event_fd, strlen((char *) dataBuf), dataBuf);
				break;
			}

			/* HandShake Protocol */


			/* */


		default :
			{
				printf("type is : %d ", type);
				printf("default : %s\n", dataBuf);
				break;
			}
	}

}
Example #12
0
int main(int argc, char *argv[])
{
//For debugging
	file = fopen("file_g_s.txt", "w");
	fprintf(file,"%s","Top of the file");
//
	
	//char send_buf[MAX_SEND_BUF_LENGTH];
	set_dsanode_ids();
	serverSocketStuff();
	
    printf("gateway_s: waiting for connections...\n");
    while(1) {  // main accept() loop
        sin_size = sizeof their_addr;
        new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
        if (new_fd == -1) {
            perror("accept");
            continue;
        }
        inet_ntop(their_addr.ss_family,get_in_addr((struct sockaddr *)&their_addr),s, sizeof s);

        printf("gateway_s: got connection from %s\n", s);
		//fprintf(file,"%s","server: got connection from");
		//fprintf(file,"%s\n",s);
		//Threading
		childPID=fork();
		if(childPID>=0)
		{
			if(childPID == 0){ //Child process
				close(sockfd); // child doesn't need the listener
				//Wait for #ofChunks:X message from p
				recvFrom(new_fd, 0);
				char subbuff[10];
				memcpy( subbuff, recv_buff, 10 );
				subbuff[10] = '\0';
				if(strcmp(subbuff, "#ofChunks:")==0){
					sendTo(new_fd, "OK"); //the # of chunks that client desires to get
				}
				else{
					printf("Recved irrelevant message:%s\n", recv_buff);
					exit(1);
				}
				//send the bulk data to the client
				strncpy(subbuff, recv_buff+strlen("#ofChunks:"), (strlen(recv_buff)-strlen("#ofChunks:")));
				nofChunksToRecv=atoi(subbuff);
				printf("nofChunksToRecv:%d\n", nofChunksToRecv);
				while(1){
					numbytes=recvFrom(new_fd, 0);
					fprintf(file, "\nnumbytes recved: %d",numbytes);
					//printf("GW RECEIVED: '%s'\n",recv_buff);
					fprintf(file,"\n%s",recv_buff);
					pthread_join(tt,NULL); //Wait for the previous thread to finish
					strcat(send_buff, recv_buff);//buffer all the data to be sent to dsa stage
					//Instead of writing the recved data to a file send the data to the staging nodes
					int rc = pthread_create(&tt, NULL, sendToStage, NULL);
					if (rc){
				    	printf("ERROR; return code from pthread_create() is %d\n", rc);
				        exit(-1);
					}
					memset(recv_buff, 0, MAXRECVLENGTH);
				}
			}
			else{//parent process
				close(new_fd);  // parent doesn't need this
				//Listen the channel by inf while
			}
		}
		else{
			printf("\n Fork failed, exit !\n");
	        return 1;
		}

	}
	fclose(file); /*done!*/ 
    return 0;
}
Example #13
0
void client_recv(int event_fd, Peer *peer)
{

  unsigned char headerBuf[HEADERSIZE]; 
  unsigned char dataBuf[DATASIZE];
  int len;

  memset(headerBuf, 0x00, HEADERSIZE);
  memset(dataBuf,   0x00, DATASIZE);

  Peer t_peer;
  t_peer.socket = event_fd;

  printf("recv start \n");
  len =  recvFrom(&t_peer, headerBuf, dataBuf);  
  

  int type = byteToInt(headerBuf, 0);

  printf("read end type : %d\n", type);

  if( len < 0 || len == 0 )
  {
      userpool_delete(event_fd, peer);
      close(event_fd);
      return;
  }
  
  printf("start type classify\n");
  switch(type)
  {
	case 0 : 
	{

		//userpool_send(headerBuf, peer);
		//userpool_send(dataBuf, peer);

		break;
	}

        case 1 :
	{
		Peer auth;
		auth.socket = g_epoll_auth;
		
		if(g_epoll_auth == 0)
		{
			//Exception
			printf("auth server not running \n");
			break;
		}	

		printf("login request to : %d, %d, %s \n", auth.socket, strlen(dataBuf), dataBuf);
		sendTo(&auth, 1, event_fd, strlen(dataBuf), dataBuf);

		break;
	}

	case 101 :
	{
		printf("Auth Serv Binding \n");
		
		g_epoll_auth = event_fd;

		printf("Auth Serv fd is : %d \n", event_fd);

		sendTo(g_epoll_auth, 102, event_fd , strlen(dataBuf), dataBuf);

		printf("Auth Serv Binding End \n");
 		break;
	}
	case 102 : 
	{
		printf("Dir Serv Binding \n");
	}
 
	default :
	{
		printf("default\n");
	}
  }

}