Example #1
0
Variant f_socket_server(CStrRef hostname, int port /* = -1 */,
                        VRefParam errnum /* = null */,
                        VRefParam errstr /* = null */) {
  Object ret;
  Socket *sock = NULL;
  const char *name = hostname.data();
  if (!create_new_socket(name, port, errnum, errstr, ret, sock, 0.0)) {
    return false;
  }
  assert(ret.get() && sock);

  sockaddr_storage sa_storage;
  struct sockaddr *sa_ptr;
  size_t sa_size;
  if (!set_sockaddr(sa_storage, sock, name, port, sa_ptr, sa_size)) {
    return false;
  }
  if (::bind(sock->fd(), sa_ptr, sa_size) < 0) {
    SOCKET_ERROR(sock, "unable to bind to given adress", errno);
    return false;
  }
  if (listen(sock->fd(), 128) < 0) {
    SOCKET_ERROR(sock, "unable to listen on socket", errno);
    return false;
  }

  return ret;
}
Example #2
0
Variant socket_server_impl(
  const HostURL &hosturl,
  int flags, /* = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN */
  VRefParam errnum /* = null */,
  VRefParam errstr /* = null */
) {
  errnum = 0;
  errstr = empty_string();
  auto sock = create_new_socket(hosturl, errnum, errstr);
  if (!sock) {
    return false;
  }

  sockaddr_storage sa_storage;
  struct sockaddr *sa_ptr;
  size_t sa_size;
  if (!set_sockaddr(sa_storage, sock, hosturl.getHost().c_str(),
                    hosturl.getPort(), sa_ptr, sa_size)) {
    return false;
  }
  int yes = 1;
  setsockopt(sock->fd(), SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
  if ((flags & k_STREAM_SERVER_BIND) != 0 &&
      ::bind(sock->fd(), sa_ptr, sa_size) < 0) {
    SOCKET_ERROR(sock, "unable to bind to given address", errno);
    return false;
  }
  if ((flags & k_STREAM_SERVER_LISTEN) != 0 && listen(sock->fd(), 128) < 0) {
    SOCKET_ERROR(sock, "unable to listen on socket", errno);
    return false;
  }

  return Variant(std::move(sock));
}
Example #3
0
int game_add_connect_event(struct sockaddr *sa, int socklen, CLIENT_MAP *client_map)
{
	int ret;
	struct event *event_conn = &client_map->event_recv;
	int fd = 0;
	
	fd = create_new_socket(0);
	if (0 != event_assign(event_conn, base, fd, EV_READ|EV_PERSIST, cb_recv, client_map)) {
		log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "%s %d: event_new failed[%d]", __FUNCTION__, __LINE__, errno);				
		goto fail;
	}
	event_add(event_conn, NULL);
	
	ret = evutil_socket_connect(&fd, sa, socklen);
	if (ret < 0) {
		log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "%s %d: evutil_socket_connect failed[%d]", __FUNCTION__, __LINE__, errno);		
		goto fail;
	}

	game_set_socket_opt(fd);
	
	return (fd);
fail:
	if (fd > 0) {
		evutil_closesocket(fd);		
	}
	if (event_conn) {
		event_del(event_conn);		
	}
	return (-1);	
}
Example #4
0
int main(int argc, char *argv[]) {
    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }

    int portno;
    portno = atoi(argv[2]);

    int my_socket;
    my_socket = create_new_socket();
    if (my_socket < 0) error("ERROR opening socket");

    struct sockaddr_in serv_addr;
    sockaddr_generator(&serv_addr, argv[1], portno);
    struct sockaddr* serv_sockaddr = (struct sockaddr *) &serv_addr;

    if (connect(my_socket, serv_sockaddr, sizeof(serv_addr)) < 0)
        error("ERROR connecting");

    char* buffer = "a";

    char read_buffer[256];
    bzero(read_buffer,256);

    int kk = 0;
    int write_n, read_n;
    ticks t1, t2;
    double sum = 0.0;
    int loop_times = 1000;
    /*printf("before testing!\n");*/
    for(kk = 0 ; kk < loop_times; kk ++){
      bzero(read_buffer,256);
      /*printf("I write:%s\n", buffer);*/
      read_n = read(my_socket,read_buffer,255);
      t1 = getticks();
      write_n = write(my_socket,buffer,strlen(buffer));
      read_n = read(my_socket,read_buffer,255);
      t2 = getticks();
      double etime = elapsed(t2,t1);
      sum += etime;
      /*printf("elapsed time: %f milliseconds\n", etime * 0.417 / 1e6);*/
      if (write_n < 0) 
        error("ERROR writing to socket");
      if (read_n < 0) 
        error("ERROR reading from socket");
      write_n = write(my_socket,buffer,strlen(buffer));
      /*printf("I read: %s\n", read_buffer);*/
    }

    printf("%f\n", (sum / loop_times) * 0.417 / 1e6);
    close(my_socket);
    return 0;
}
Example #5
0
int game_add_listen_event(uint16_t port, LISTEN_CALLBACKS *callback)
{
	struct event *event_accept = &callback->event_accept;
	int fd = 0;
	struct sockaddr_in addr;

	if (!callback || !callback->cb_get_client_map)
		return (-1);
	
	fd = create_new_socket(1);
	if (fd < 0) {
		log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "%s: create new socket failed[%d]", __FUNCTION__, errno);
		return (-2);		
	}
	evutil_make_listen_socket_reuseable(fd);	
	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = htonl(0);
	addr.sin_port = htons(port);	
	if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
		log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "%s: bind failed[%d]", __FUNCTION__, errno);
		return (-10);
	}
	if (listen(fd, 128) != 0) {
		log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "%s: listen failed[%d]", __FUNCTION__, errno);
		return (-20);		
	}
	if (0 != event_assign(event_accept, base, fd, EV_READ|EV_PERSIST, cb_listen, (void *)callback)) {
		log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "%s: event_new failed[%d]", __FUNCTION__, errno);
		goto fail;
	}
	event_add(event_accept, NULL);
	return (0);
fail:
	if (fd > 0) {
		evutil_closesocket(fd);				
	}
	if (event_accept) {
		event_del(event_accept);				
	}
	return (-1);
}
Example #6
0
int main(int argc, char *argv[]) {
  if (argc < 2) {
    fprintf(stderr,"ERROR: no port provided\n");
    exit(1);
  }

  // create a new socket
  int my_socket;
  my_socket = create_new_socket();
  if (my_socket < 0) 
    error("ERROR: failed to create new socket");

  int portno;
  portno = atoi(argv[1]);

  struct sockaddr_in serv_addr;
  sockaddr_generator(&serv_addr, NULL, portno);

  //bind
  if (bind(my_socket, (struct sockaddr *) &serv_addr,
        sizeof(serv_addr)) < 0) 
    error("ERROR: binding to socket failed");

  // listen: on my_socket with queue size 5
  listen(my_socket,100);

  printf("===tcp rount trip time experiment===\n");
  while(1){
    printf("Log: waiting for client to connect!\n");
    int newsockfd;
    // accept will block until some client connect to the port
    newsockfd = accept_incoming_connection(my_socket);
    printf("Log: client accepted!\n");
    if (newsockfd < 0) 
      error("ERROR: error when accepting connection");

    int read_n, write_n, kk;
    char buffer[256];
    char* ack = "a";
    int loop_times = 1000;
    printf("Log: testing round trip 1000 times!\n");
    for( kk = 0 ; kk < loop_times ; kk ++ ){
      // read and print the message sent from client
      bzero(buffer,256);
      /*printf("\n++debug++ before read\n");*/
      // read should block too, not sure ??
      write_n = write(newsockfd, ack, strlen(ack));
      read_n = read(newsockfd, buffer, 255);
      /*printf("Here is the message: %s\r",buffer);*/

      // write ack back to client
      /*printf("\n++debug++ before write\n");*/
      write_n = write(newsockfd, ack, strlen(ack));
      read_n = read(newsockfd, buffer, 255);
      if (read_n < 0){
        printf("reading fault\n");
        error("ERROR: reading from socket failed");
      }
      if (write_n <= 0){
        printf("writing fault\n");
        error("ERROR: writing to socket failed");
      }
      /*printf("\n++debug++ end of while\n");*/
    }
    // close connection
    close(newsockfd);
    printf("Log: client left!\n\n");
  }

  close(my_socket);
  return 0; 
}
Example #7
0
static Variant sockopen_impl(CStrRef hostname, int port, Variant &errnum,
                             Variant &errstr, double timeout,
                             bool persistent) {
  string key;
  if (persistent) {
    key = hostname.data();
    key += ":";
    key += boost::lexical_cast<string>(port);
    Socket *sock =
      dynamic_cast<Socket*>(g_persistentObjects->get("socket", key.c_str()));
    if (sock) {
      if (sock->getError() == 0 && sock->checkLiveness()) {
        return Object(sock);
      }

      // socket had an error earlier, we need to remove it from persistent
      // storage, and create a new one
      g_persistentObjects->remove("socket", key.c_str());
    }
  }

  Object ret;
  const char *name = hostname.data();
  Socket *sock = NULL;

  if (timeout <= 0) timeout = RuntimeOption::SocketDefaultTimeout;
  // test if protocol is SSL
  SSLSocket *sslsock = SSLSocket::Create(name, port, timeout);
  if (sslsock) {
    sock = sslsock;
    ret = sock;
  } else if (!create_new_socket(name, port, errnum, errstr,
                                ret, sock, timeout)) {
    return false;
  }
  assert(ret.get() && sock);

  sockaddr_storage sa_storage;
  struct sockaddr *sa_ptr;
  size_t sa_size;
  if (!set_sockaddr(sa_storage, sock, name, port, sa_ptr, sa_size)) {
    return false;
  }

  int retval;
  int fd = sock->fd();
  IOStatusHelper io("socket::connect", name, port);
  if (timeout <= 0) {
    retval = connect(fd, sa_ptr, sa_size);
  } else {
    // set non-blocking so we can do timeouts
    long arg = fcntl(fd, F_GETFL, NULL);
    fcntl(fd, F_SETFL, arg | O_NONBLOCK);

    retval = connect(fd, sa_ptr, sa_size);
    if (retval < 0) {
      if (errno == EINPROGRESS) {
        struct pollfd fds[1];
        fds[0].fd = fd;
        fds[0].events = POLLOUT;
        if (poll(fds, 1, (int)(timeout * 1000))) {
          socklen_t lon = sizeof(int);
          int valopt;
          getsockopt(fd, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon);
          if (valopt) {
            std::string msg = "failed to connect to ";
            msg += name;
            msg += ":";
            msg += boost::lexical_cast<std::string>(port);
            SOCKET_ERROR(sock, msg.c_str(), valopt);
            errnum = sock->getError();
            errstr = String(Util::safe_strerror(sock->getError()));
            return false;
          } else {
            retval = 0; // success
          }
        } else {
          std::string msg = "timed out after ";
          msg += boost::lexical_cast<std::string>(timeout);
          msg += " seconds when connecting to ";
          msg += name;
          msg += ":";
          msg += boost::lexical_cast<std::string>(port);
          SOCKET_ERROR(sock, msg.c_str(), ETIMEDOUT);
          errnum = sock->getError();
          errstr = String(Util::safe_strerror(sock->getError()));
          return false;
        }
      }
    }

    // set to blocking mode
    arg = fcntl(fd, F_GETFL, NULL);
    fcntl(fd, F_SETFL, arg & ~O_NONBLOCK);
  }

  if (retval != 0) {
    errnum = sock->getError();
    errstr = String(Util::safe_strerror(sock->getError()));
    return false;
  }

  if (sslsock && !sslsock->onConnect()) {
    raise_warning("Failed to enable crypto");
    return false;
  }

  if (persistent) {
    assert(!key.empty());
    g_persistentObjects->set("socket", key.c_str(), sock);
  }

  return ret;
}
int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr,"ERROR: no port provided\n");
        exit(1);
    }

    // create a new socket
    int my_socket;
    my_socket = create_new_socket();
    if (my_socket < 0)
        error("ERROR: failed to create new socket");

    int portno;
    portno = atoi(argv[1]);

    struct sockaddr_in serv_addr;
    sockaddr_generator(&serv_addr, NULL, portno);

    //bind
    if (bind(my_socket, (struct sockaddr *) &serv_addr,
             sizeof(serv_addr)) < 0)
        error("ERROR: binding to socket failed");

    // listen: on my_socket with queue size 5
    listen(my_socket,100);

    printf("===tcp setup time experiment===\n");
    while(1) {
        int kk;
        int loop_times = 100;
        int newsockfd;
        char* ack = "a";
        char buffer[256];
        int read_n, write_n;
        printf("ready and wait to run tcp setup and tear down for %d times.\n", loop_times);
        double sum = 0.0;
        double sum2 = 0.0;
        double sum3 = 0.0;
        for( kk = 0 ; kk < loop_times; kk ++ ) {
            bzero(buffer,256);
            // accept will block until some client connect to the port
            newsockfd = accept_incoming_connection(my_socket);
            /*if (newsockfd < 0) */
            /*error("ERROR: error when accepting connection");*/

            // read and print the message sent from client
            // read should block too, not sure ??
            /*read_n = read(newsockfd, buffer, 255);*/
            // write ack back to client
            /*write_n = write(newsockfd, ack, strlen(ack));*/
            /*ticks t0 = getticks();*/
            read_n = read(newsockfd, buffer, 255);

            ticks t1 = getticks();
            /*if (read_n < 0) error("ERROR: reading from socket failed");*/
            /*if (write_n <= 0) error("ERROR: writing to socket failed");*/
            close(newsockfd);
            ticks t2 = getticks();
            double etime = elapsed(t2, t1);
            /*double etime2 = elapsed(t1, t0);*/
            /*double etime3 = elapsed(t2, t0);*/
            sum += etime;
            /*sum2 += etime2;*/
            /*sum3 += etime3;*/
        }
        printf("%f\n", (sum / loop_times) * 0.417 / 1e6);
        /*printf("%f\n", (sum2 / loop_times) * 0.417 / 1e6);*/
        /*printf("%f\n", (sum3 / loop_times) * 0.417 / 1e6);*/
        // close connection
        printf("Log: client left!\n\n");
    }

    close(my_socket);
    return 0;
}