示例#1
0
static int randombind(struct dns_transmit *d)
{
  int j;

  for (j = 0;j < 10;++j)
    if (socket_bind4(d->s1 - 1,d->localip,1025 + dns_random(64510)) == 0)
      return 0;
  if (socket_bind4(d->s1 - 1,d->localip,0) == 0)
    return 0;
  return -1;
}
示例#2
0
static int doit(stralloc *out,int s,char ipremote[4],uint16 portremote,char iplocal[4],uint16 portlocal,unsigned int timeout)
{
  buffer b;
  char bspace[128];
  char strnum[FMT_ULONG];
  int numcolons;
  char ch;

  if (socket_bind4(s,iplocal,0) == -1) return -1;
  if (timeoutconn(s,ipremote,113,timeout) == -1) return -1;

  buffer_init(&b,mywrite,s,bspace,sizeof bspace);
  buffer_put(&b,strnum,fmt_ulong(strnum,portremote));
  buffer_put(&b," , ",3);
  buffer_put(&b,strnum,fmt_ulong(strnum,portlocal));
  buffer_put(&b,"\r\n",2);
  if (buffer_flush(&b) == -1) return -1;

  buffer_init(&b,myread,s,bspace,sizeof bspace);
  numcolons = 0;
  for (;;) {
    if (buffer_get(&b,&ch,1) != 1) return -1;
    if ((ch == ' ') || (ch == '\t') || (ch == '\r')) continue;
    if (ch == '\n') return 0;
    if (numcolons < 3) {
      if (ch == ':') ++numcolons;
    }
    else {
      if (!stralloc_append(out,&ch)) return -1;
      if (out->len > 256) return 0;
    }
  }
}
int socket_bind4_reuse(int s,const char *ip,uint16 port) {
  int one=1;
  setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&one,sizeof one);
#ifdef SO_REUSEPORT
  setsockopt(s,SOL_SOCKET,SO_REUSEPORT,&one,sizeof one);
#endif
  return winsock2errno(socket_bind4(s,ip,port));
}
示例#4
0
void mainloop(int sock)
{
  char code;
  int newsock;
  iopoll_fd fds;
  fds.fd = sock;
  fds.events = IOPOLL_READ;
  for (;;) {
    switch (iopoll_restart(&fds, 1, timeout*1000)) {
    case -1:
      return;
    case 0:
      /* Timed out */
      if (kill(ppid, 0) == -1) return;
      continue;
    default:
      if (read(sock, &code, 1) != 1) return;
      code = 0;
      if ((newsock = socket_tcp()) == -1) {
	error1sys("Creating socket failed");
	code = 1;
      }
      else if (!socket_reuse(newsock)) {
	error1sys("Setting flags on socket failed");
	code = 2;
      }
      else if (!socket_bind4(newsock, &ip, port)) {
	error1sys("Binding socket failed");
	code = 3;
      }
      if (write(sock, &code, 1) != 1)
	error1sys("Sending the result code failed");
      if (!code)
	if (!socket_sendfd(sock, newsock))
	  error1sys("Sending the bound socket failed");
      close(newsock);
    }
  }
}
示例#5
0
int setup_udp_server_socket(const char ip[4], const char ip6[16], u16 port) {
    char sip[FMT_IP6];
    int fd;

    fd = socket_udp6();
    if(fd >= 0) {
        if(socket_bind6(fd, ip6, port, 0) == -1) {
            close(fd);
            fd = socket_udp();
            if(socket_bind4(fd, ip, port) == -1) {
                ERROR("unable to create server socket: %s", strerror(errno));
            } else {
                fmt_ip4(sip, ip);
                DEBUG("bound UDP socket on %s:%hu", sip, port);
            }
        } else {
            fmt_ip6(sip, ip6);
            DEBUG("bound UDP socket on [%s]:%hu", sip, port);
        }
    } else {
        ERROR("unable to create UDP socket: %s", strerror(errno));
    }
    return fd;
}
int socket_bind4_reuse(int s,char ip[4],uint16 port)
{
  int opt = 1;
  setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof opt);
  return socket_bind4(s,ip,port);
}
示例#7
0
int main(int argc,char* argv[]) {
  unsigned long count=1000;
  int v6;

  v6=0;

  {
    struct rlimit rl;
    rl.rlim_cur=RLIM_INFINITY; rl.rlim_max=RLIM_INFINITY;
    setrlimit(RLIMIT_NOFILE,&rl);
#ifdef RLIMIT_NPROC
    setrlimit(RLIMIT_NPROC,&rl);
#endif
  }

  for (;;) {
    int i;
    int c=getopt(argc,argv,"h6c:");
    if (c==-1) break;
    switch (c) {
    case 'c':
      i=scan_ulong(optarg,&count);
      if (i==0 || optarg[i]) {
	buffer_puts(buffer_2,"httpbench: warning: could not parse count: ");
	buffer_puts(buffer_2,optarg+i+1);
	buffer_putsflush(buffer_2,"\n");
      }
      break;
    case '6':
      v6=1;
      break;
    case 'h':
      buffer_putsflush(buffer_2,
		  "usage: bindbench [-h] [-6] [-c count]\n"
		  "\n"
		  "\t-h\tprint this help\n"
		  "\t-c n\tbind n sockets to port 0 (default: 1000)\n"
		  "\t-6\tbind IPv6 sockets instead of IPV4\n");
      return 0;
    }
  }


  {
    int i,r;
    char ip[16];
    int port;
#ifdef __i386__
    unsigned long long a,b,c;
#else
    struct timeval a,b,c;
    unsigned long d;
#endif
    int *socks=alloca(count*sizeof(int));
    port=0; byte_zero(ip,16);
    for (i=0; i<count; ++i) {
#ifdef __i386__
      rdtscl(a);
#else
      gettimeofday(&a,0);
#endif
      socks[i]=v6?socket_tcp6():socket_tcp4();
#ifdef __i386__
      rdtscl(b);
#else
      gettimeofday(&b,0);
#endif
      if (socks[i]==-1) {
	buffer_puts(buffer_2,"socket() failed: ");
	buffer_puterror(buffer_2);
	buffer_putnlflush(buffer_2);
	exit(1);
      }
      if (v6)
	r=socket_bind6(socks[i],ip,port,0);
      else
	r=socket_bind4(socks[i],ip,port);
      if (r==-1) {
	buffer_puts(buffer_2,"bind() failed: ");
	buffer_puterror(buffer_2);
	buffer_putnlflush(buffer_2);
	exit(1);
      }
#ifdef __i386__
      rdtscl(c);
      buffer_putulong(buffer_1,b-a);
#else
      gettimeofday(&c,0);
      d=(b.tv_sec-a.tv_sec)*1000000;
      d=d+b.tv_usec-a.tv_usec;
      buffer_putulong(buffer_1,d);
#endif
      buffer_putspace(buffer_1);
#ifdef __i386__
      buffer_putulong(buffer_1,c-b);
#else
      d=(c.tv_sec-b.tv_sec)*1000000;
      d=d+c.tv_usec-b.tv_usec;
      buffer_putulong(buffer_1,d);
#endif
      buffer_puts(buffer_1,"\n");
      if (i>50) {
	close(socks[10]);
	socks[10]=v6?socket_tcp6():socket_tcp4();
      }
    }
  }

  buffer_flush(buffer_1);
  return 0;
}
int socket_bind4_reuse (int s, char const *ip, uint16 port)
{
  unsigned int opt = 1 ;
  setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt) ;
  return socket_bind4(s, ip, port) ;
}