Exemplo n.º 1
0
int main(int argc, char *argv[])
{
  int socket_fd, cc, fsize;
  
	struct sockaddr_in  s_in, from;

	struct { 
		char head; 
		u_long  body; 
		char tail;
	} msg;

  // This creates a socket and assigns is to socket_fd
  socket_fd = socket (AF_INET, SOCK_DGRAM, 0);

  // Writes zeros to s_in for s_in length
  bzero((char *) &s_in, sizeof(s_in));

  // Assigns a protocal to the socket. AF_INET refers to addresses from the internet, specifically IP addresses
  s_in.sin_family = (short)AF_INET;

  // INADDR_ANY is the IPv4 wildcard address. It is usefor for applications that bind Internet domain sockets on mulihomed hosts
  s_in.sin_addr.s_addr = htonl(INADDR_ANY);

  // htons converts MYPORT between host and network byte order
  s_in.sin_port = htons((u_short) MYPORT);

  printsin( &s_in, "RECV_UDP", "Local socket is:"); 
  fflush(stdout);

  // bind assigns a name to an unnamed address. It assigns socket_fd to the socket address
  bind(socket_fd, (struct sockaddr *)&s_in, sizeof(s_in));

  for(;;) {
		fsize = sizeof(from);
    cc = Recvfrom(socket_fd, &msg, sizeof(msg), 0, (struct sockaddr *) &from, &fsize);
    printsin( &from, "recv_udp: ", "Packet from:");

    // Converts between host and network byte order so msg.body can be printed
    printf("Got data ::%c%ld%c\n", msg.head, (long) ntohl(msg.body),
    msg.tail); 
    fflush(stdout);
  }
  
  return 0;
}
Exemplo n.º 2
0
int main(int argc, char *argv[]) {

//SOCKET FOR DGRAM QUERIES-------------------------------------------------------------
	int d_fd, d_ecode;
	struct sockaddr_in *d_addr;
	struct addrinfo d_hints, *d_addrlist;

	memset(&d_hints, 0, sizeof(d_hints));
	d_hints.ai_family = AF_INET; d_hints.ai_socktype = SOCK_DGRAM;
	d_hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE; d_hints.ai_protocol = 0;
	d_hints.ai_canonname = NULL; d_hints.ai_addr = NULL;
	d_hints.ai_next = NULL;

	d_ecode = getaddrinfo(NULL, "13107", &d_hints, &d_addrlist);
	if (d_ecode != 0) {
	  fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(d_ecode));
	  exit(1);
	}

	d_addr = (struct sockaddr_in *) d_addrlist->ai_addr;

//	printsin(d_addr, "FANCY_RECV_UDP", "Local socket is:"); fflush(stdout);

	d_fd = socket (d_addrlist->ai_family, d_addrlist->ai_socktype, 0);
	if (d_fd < 0) {
	  perror ("fancy_recv_udp:socket");
	  exit (1);
	}

	/*
	   bind port 0x3333 on the current host to the socket accessed through
	   socket_fd. If port in use, die.
	*/
	if (bind(d_fd, (struct sockaddr *)d_addr, sizeof(struct sockaddr_in)) < 0) {
	  perror("fancy_recv_udp:bind");
	  exit(1);
	}

//SOCKET FOR STREAM GAMES----------------------------------------------------------------------
	int s_ecode, listener;  /* fd for socket on which we get connection requests */
	struct sockaddr_in *s_addr;
	struct addrinfo s_hints, *s_addrlist;

	/* 
	   Want to specify local server address of:
	      addressing family: AF_INET
	      ip address:        any interface on this system 
	      port:              0 => system will pick free port
	*/

	memset(&s_hints, 0, sizeof(s_hints));
 	s_hints.ai_family = AF_INET; s_hints.ai_socktype = SOCK_STREAM;
	s_hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE; s_hints.ai_protocol = 0;
 	s_hints.ai_canonname = NULL; s_hints.ai_addr = NULL;
 	s_hints.ai_next = NULL;

	s_ecode = getaddrinfo(NULL, "0", &s_hints, &s_addrlist);
	if (s_ecode != 0) {
	  fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s_ecode));
	  exit(1);
	}

	s_addr = (struct sockaddr_in *) s_addrlist->ai_addr;
	 
	/*
	   Create socket on which we will accept connections. This is NOT the
	   same as the socket on which we pass data.
	*/
	if ( (listener = socket( s_addrlist->ai_family, s_addrlist->ai_socktype, 0 )) < 0 ) {
	  perror("inet_rstream:socket");
	  exit(1);
	}


	if (bind(listener, (struct sockaddr *)s_addr, sizeof(struct sockaddr_in)) < 0) {
	  perror("inet_rstream:bind");
	  exit(1);
	}

	/*
	   Print out the port number assigned to this process by bind().
	*/
	socklen_t length;
	length = sizeof(struct sockaddr_in);
	if (getsockname(listener, (struct sockaddr *)s_addr, &length) < 0) {
	  perror("inet_rstream:getsockname");
	  exit(1);
	}
	printf("RSTREAM:: assigned port number %d\n", ntohs(s_addr->sin_port));

	/*
	   Now accept a single connection. Upon connection, data will be
	   passed through the socket on descriptor conn.
	*/
	listen(listener,1);

	int conn;      /* fd for socket thru which we pass data */
	struct sockaddr_in peer;
	length = sizeof(peer);

//PUSH THE START BUTTON-------------------------------------------------------------------
	fd_set mask;
	int hits;
	while(1) {
	  FD_ZERO(&mask);
	  FD_SET(0,&mask);
	  FD_SET(d_fd,&mask);
	  FD_SET(listener,&mask);
	  if ((hits = select(listener+1, &mask, (fd_set *)0, (fd_set *)0,
		                 NULL)) < 0) {
	    perror("fancy_recv_udp:select");
	    exit(1);
	  }

//	  IF QUERY
	  if(FD_ISSET(d_fd, &mask)){
	    int cc;
	    struct sockaddr_in from;
	    socklen_t fsize;
	    char  msg[20];
	    fsize = sizeof(from);

//	    RECEIVE DATAGRAM
	    cc = recvfrom(d_fd,&msg,sizeof(msg),0,(struct sockaddr *)&from,&fsize);
	    if (cc < 0) perror("recv_udp:recvfrom");
	    printsin( &from, "recv_udp: ", "Packet from:");
	    printf("Got data ::%s\n",msg);

	    int i;
	    for (i=0; i<hlength; i++){
			int k;
			for(k=0; k<20 && handles[i][k]!='\0';k++){
				printf("%c",handles[i][k]);
			}
			printf("\n");
	    }

//	    SEND DATAGRAM
	    char response[2048];
	    int spot=0;
	    for (i=0;i<hlength;i++){
		int j;
		response[spot]='\n';
		spot++;
		for(j=0;j<20 && handles[i][j]!='\0'; j++){
			response[spot]=handles[i][j];
			printf("response[%d] = handles[%d][%d]\n",spot,i,j);
			printf("response so far: %s",response);
			spot++;
		}
	    }
	    response[spot++]='\0';
	    printf("response so far: %s",response);
	    sendto(d_fd,&response,sizeof(response),0,(struct sockaddr *)&from,fsize);
//	    connect(d_fd, (struct sockaddr *)&from, fsize);
//	    send(d_fd, &response, sizeof(response), 0);
	    fflush(stdout);
	  }

//	IF GAMETIME
	if (FD_ISSET(listener, &mask)){
		if ((conn=accept(listener, (struct sockaddr *)&peer, &length)) < 0) {
		  perror("inet_rstream:accept");
		  exit(1);
		}
		printsin(&peer,"RSTREAM::", "accepted connection from"); 
		printf("\n\nRSTREAM:: data from stream:\n");

		char handle[20]={0};
		char ch='\0';
		int i=0;
		while (read(conn, &ch, 1) == 1 && ch!='\n'){
			handle[i]=ch;
			i++;
		}
		printf("NEW HANDLE!: %s\n", handle);

		for(i=0;i<strlen(handle);i++){
			handles[hlength][i]=handle[i];
		}
		handles[hlength][i+1]='\0';
		hlength++;

		for (i=0; i<hlength; i++){
			int k;
			for(k=0; k<20 && handles[i][k]!='\0';k++){
				printf("%c",handles[i][k]);
			}
			printf("\n");
		}
		if(hlength % 2 == 0){
			printf("SHITS GOING DOWN!\n");
		}
	  }
	}
	exit(1);
}