diff --git a/install.sh b/install.sh index 7cea9c8..a660abd 100755 --- a/install.sh +++ b/install.sh @@ -244,6 +244,7 @@ install_exec slowio/slowio-mem-control "$DESTDIR$sysconfdir/s install_exec slowio/slowio "$DESTDIR$usr_sbindir/slowio" install_data misc_systemd_units/fix-lpp.service "$DESTDIR$systemdunitdir/fix-lpp.service" install_exec misc_etc_files/mxq/gpu-policy "$DESTIDIR$sysconfdir/mxq/gpu-policy" +install_exec send/send "$DESTDIR$usr_bindir/send" postinstall exit diff --git a/send/send b/send/send new file mode 100755 index 0000000..da1fe50 Binary files /dev/null and b/send/send differ diff --git a/send/send.c b/send/send.c new file mode 100644 index 0000000..22e745a --- /dev/null +++ b/send/send.c @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef IPPORT_DISCARD +#define IPPORT_DISCARD 9 +#endif + +void usage() { + fprintf(stderr,"usage: send host [port]\n"); + exit(EXIT_FAILURE); +} + +static int gotAlarm=0; + +void sigAlarm() { + gotAlarm=1; +} + +void setLinger(int s) +{ + int status; + struct linger linger = {1,300}; /* on, seconds */ + /* DigitalUnix bug : close does not + return error if timeout. */ + + status = setsockopt(s,SOL_SOCKET,SO_LINGER,&linger,sizeof(linger)); + if (status<0) {perror("setsockopt");exit(EXIT_FAILURE);} +} + +static char buffer[8192]; + + +int main(int argc,char *argv[]) { + + char *host; + short port; + struct hostent *he; + struct sockaddr_in sin; + int s; + int i; + int status; + unsigned long byteCount; + double bps; + struct timeval startTime; + struct timeval endTime; + double elapsed; + + + int seconds=10; + + if (argc<2 || argc>3) usage(); + host=argv[1]; + port = argc==3 ? atoi(argv[2]) : IPPORT_DISCARD; + + memset(buffer,0xA3,sizeof(buffer)); + + he=gethostbyname(host); + + if (!he) {fprintf(stderr,"unknown host: %s\n",host);exit(EXIT_FAILURE);} + + host=(char *)he->h_name; + + s=socket(he->h_addrtype,SOCK_STREAM,0); + if (s<0) {perror("socket");exit(EXIT_FAILURE);} + + setLinger(s); + + memset((void *)&sin,0,sizeof(sin)); + sin.sin_family = he->h_addrtype; + sin.sin_port = htons(port); + memcpy(&sin.sin_addr,he->h_addr,he->h_length); + + status=connect(s,(struct sockaddr *)&sin,sizeof(sin)); + if (status<0) {perror("connect");exit(EXIT_FAILURE);} + + signal(SIGALRM,sigAlarm); + alarm(seconds); + + byteCount=0; + + status = gettimeofday(&startTime,NULL); + if (status<0) {perror("gettimeofday");exit(EXIT_FAILURE);} + + fprintf(stderr,"start : %d.%d\n",startTime.tv_sec,startTime.tv_usec); + + while (1) { + int len; + + len = send(s,buffer,sizeof(buffer),0); + if (len<=0) { + if (errno == EINTR) break; + perror("send");exit(EXIT_FAILURE); + } +/* fprintf(stderr,"len: %d\n",len); */ +/* write(2,"#",1); */ + byteCount += len; + if (gotAlarm) break;; + } + +/* + + status = gettimeofday(&endTime,NULL); + if (status<0) {perror("gettimeofday");exit(EXIT_FAILURE);} + fprintf(stderr,"shutdown : %d.%d\n",endTime.tv_sec,endTime.tv_usec); + + status = shutdown(s,SHUT_RDWR); + if (status<0) {perror("shutdown");exit(EXIT_FAILURE);} + +*/ + + status = gettimeofday(&endTime,NULL); + if (status<0) {perror("gettimeofday");exit(EXIT_FAILURE);} + fprintf(stderr,"close : %d.%d\n",endTime.tv_sec,endTime.tv_usec); + + status = close(s); + if (status<0) {perror("close");exit(EXIT_FAILURE);} + + status = gettimeofday(&endTime,NULL); + if (status<0) {perror("gettimeofday");exit(EXIT_FAILURE);} + fprintf(stderr,"done : %d.%d\n",endTime.tv_sec,endTime.tv_usec); + + { double sec; + sec = endTime.tv_sec - startTime.tv_sec + + (double)(endTime.tv_usec - startTime.tv_usec)/1000000; + printf ("%lu bytes in %f seconds\n",byteCount,sec); + printf ("%f bytes / seconds\n",(double)byteCount/sec); + printf ("%f bits / seconds\n",(double)byteCount*8/sec); + printf ("%f kBit/s / seconds\n",(double)byteCount*8/1000/sec); + printf ("%f MBit/s / seconds\n",(double)byteCount*8/1000000/sec); + } +}