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; }
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)); }
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); } } }
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); }
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) ; }