blast of linux
udp tcp
server client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <pthread.h>
static long long blastNum; /* number of bytes read per ? second interval */
static int quitFlag; /* flag for stopping test */
void setTargetNetAddr(int flag)
{
}
void blasterUDPQuit(void)
{
quitFlag = 1;
}
void select_timer(void *arg)
{
int err;
do
{
pthread_testcancel();
struct timeval tv;
tv.tv_sec=2;
tv.tv_usec=0;
err=select(0,NULL,NULL,NULL,&tv);
if(err == 0)
{
if (blastNum > 0)
{
printf("%f MB/sec\n", ((float)blastNum)/(1024*1024*2));
blastNum = 0;
}
else
printf("No bytes read in the last 2 seconds.\n");
}
}while((err == 0)&&(quitFlag == 0));
return;
}
void blasteeTCP(int port,int size,int blen,int zbuf)
{
while(1)
{
int sock,sock_connect;
struct sockaddr_in server_addr,client_addr;
int len = sizeof(struct sockaddr_in); //sizeof(client_addr)
char *buffer = 0;
int nrecv = 0;
buffer = (char *)malloc(sizeof(char)*size);
if(buffer == 0)
{
printf("malloc error\r\n");
return;
}
if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("cannot create socket\r\n");
free(buffer);
buffer = 0;
return;
}
memset(&server_addr,0,sizeof(struct sockaddr_in));
memset(&client_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(port);
int on = 1;
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) < 0)
{
printf ("setsockopt SO_REUSEADDR failed\r\n");
close (sock);
free (buffer);
buffer = 0;
return;
}
if(bind(sock,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0)
{
printf("bind error\r\n");
close(sock);
free(buffer);
buffer = 0;
return;
}
printf("bind after..\r\n");
if(listen(sock,5) < 0)
{
printf("listen failed\r\n");
close(sock);
free(buffer);
buffer = 0;
return;
}
printf("listen start..\r\n");
blastNum = 0;
quitFlag = 0;
pthread_t pthread_tst;
pthread_create(&pthread_tst,NULL,(void *)select_timer,NULL);
while((sock_connect = accept(sock,(struct sockaddr *)&client_addr,&len)) == -1);
if (setsockopt(sock_connect,SOL_SOCKET,SO_RCVBUF,(char *)&blen,sizeof(blen))< 0)
{
printf("setsockopt SO_RCVBUF failed\r\n");
close(sock);
close(sock_connect);
free(buffer);
buffer = 0;
pthread_cancel(pthread_tst);
return;
}
/* loop that reads TCP blasts */
for (;;)
{
if (quitFlag == 1)
break;
nrecv = recv(sock_connect,buffer,size,0);
if (nrecv == 0)
{
printf("blasteeTCP link down\r\n");
break;
}
else if (nrecv < 0)
{
printf("blasteeTCP recv error\r\n");
break;
}
else if (nrecv > 0)
blastNum += nrecv;
}
close(sock_connect);
close(sock);
free(buffer);
buffer = 0;
pthread_cancel(pthread_tst);
printf("blasteeTCP exit.\r\n");
}
}
void blasterTCP(char *rm_ipstr,int port,int size,int blen,int zbuf)
{
int sock;
struct sockaddr_in remote_addr;
char *buffer = 0;
int nsend = 0;
buffer = (char *)malloc(sizeof(char)*size);
if(buffer == 0)
{
printf("malloc error\r\n");
return;
}
if((sock = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("cannot create socket\r\n");
free (buffer);
buffer = 0;
return;
}
memset(&remote_addr,0,sizeof(struct sockaddr_in));
remote_addr.sin_family = AF_INET;
remote_addr.sin_addr.s_addr = inet_addr(rm_ipstr);
remote_addr.sin_port = htons (port);
if (setsockopt(sock,SOL_SOCKET,SO_SNDBUF,(void *) &blen,sizeof(blen)) < 0)
{
printf("setsockopt SO_SNDBUF failed\r\n");
close(sock);
free(buffer);
buffer = 0;
return;
}
if (connect(sock,(struct sockaddr *)&remote_addr,sizeof(remote_addr)) < 0)
{
printf("connect failed: host %s port %d\r\n",inet_ntoa(remote_addr.sin_addr),ntohs(remote_addr.sin_port));
close(sock);
free(buffer);
buffer = 0;
return;
}
printf("connect seccessed\r\n");
quitFlag = 0;
int idx;
memset(buffer,0,size);
for(idx=0;idx<(size/10);idx++)
{
memcpy(buffer+idx*10,"1234567890",10);
}
printf("sending data..\r\n");
for(;;)
{
if (quitFlag == 1)
break;
nsend = send(sock,buffer,size,0);
if (nsend < 0)
{
printf("blasterTCP send error %d\r\n",errno);
break;
}
}
close(sock);
free(buffer);
buffer = 0;
printf("blasterTCP exit.\r\n");
}
void blasteeUDP(int port,int size,int blen,int zbuf)
{
int sock;
struct sockaddr_in server_addr,client_addr;
int len = sizeof(struct sockaddr_in);
char *buffer;
int nrecv = 0;
int nsend = 0;
buffer = (char *)malloc(sizeof(char)*size);
if(buffer == 0)
{
printf("malloc error\r\n");
return;
}
if((sock = socket(AF_INET,SOCK_DGRAM,0)) < 0)
{
printf ("cannot create socket\r\n");
free (buffer);
buffer = 0;
return;
}
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons (port);
if(setsockopt(sock,SOL_SOCKET,SO_RCVBUF,(char *)&blen,sizeof (blen)) < 0)
{
printf ("setsockopt SO_RCVBUF failed\r\n");
close (sock);
free (buffer);
buffer = 0;
return;
}
int on = 1;
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) < 0)
{
printf ("setsockopt SO_REUSEADDR failed\r\n");
close (sock);
free (buffer);
buffer = 0;
return;
}
if(bind(sock,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0)
{
printf ("bind error\r\n");
close (sock);
free (buffer);
buffer = 0;
return;
}
blastNum = 0;
quitFlag = 0;
pthread_t pthread_tst;
pthread_create(&pthread_tst,NULL,(void *)select_timer,NULL);
for(;;)
{
if(quitFlag)
break;
nrecv = recvfrom(sock,buffer,size,0,(struct sockaddr *)&client_addr,&len);
if(nrecv <= 0)
continue;
else if(nrecv > 0)
blastNum += nrecv;
}
close (sock);
free (buffer);
buffer = 0;
pthread_cancel(pthread_tst);
printf ("blasteeUDP exit.\r\n");
}
void blasterUDP (char *rm_ipstr,int port,int size,int blen,int zbuf)
{
int sock;
struct sockaddr_in remote_addr;
int len = sizeof(struct sockaddr_in);
char *buffer = 0;
int nrecv = 0;
int nsend = 0;
buffer = (char *)malloc(sizeof(char)*size);
if(buffer == 0)
{
printf("malloc error\r\n");
return;
}
if((sock = socket(AF_INET,SOCK_DGRAM,0)) < 0)
{
printf ("cannot create socket\r\n");
free (buffer);
buffer = 0;
return;
}
memset(&remote_addr,0,sizeof(struct sockaddr_in));
remote_addr.sin_family = AF_INET;
remote_addr.sin_addr.s_addr = inet_addr(rm_ipstr);
remote_addr.sin_port = htons (port);
if(setsockopt(sock,SOL_SOCKET,SO_SNDBUF,(void *)&blen,sizeof(blen)) < 0)
{
printf ("setsockopt SO_SNDBUF failed\r\n");
close(sock);
free (buffer);
buffer = 0;
return;
}
quitFlag = 0;
int idx;
memset(buffer,0,size);
for(idx=0;idx<(size/10);idx++)
{
memcpy(buffer+idx*10,"1234567890",10);
}
for (;;)
{
if (quitFlag == 1)
break;
nsend = sendto(sock,buffer,size,0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr_in));
/* sendto() and zbufSockBufSendto() both error-out for
* some strange reason. Somehow this doesn't seem to
* affect the test,and we can get away with ignoring
* the errors.
*/
if (nsend < 0)
continue;
}
close(sock);
free (buffer);
buffer = 0;
printf ("blasterUDP exit.\r\n");
}
int test_ipstr(char *ipaddr)
{
char *pnum,*pdot=ipaddr;
for(;*ipaddr;ipaddr=pdot++)
{
int t=0,e=1;
if(*(pnum=pdot)=='.')
return 0;
for(;*pdot!='.'&&*pdot;++pdot);
for(ipaddr=pdot-1;ipaddr>=pnum;t+=e*(*ipaddr---'0'),e*=10);
if(t<0||t>255||(pdot-pnum==3&&t<100)||(pdot-pnum==2&&t<10))
return 0;
}
return 1;
}
void net_test_main(int c, int psize)
{
int bufsize;
//int core_id = cpu_id_get();
int core_id = 0;
char str[20] = {0};
if((c == 3)||(c == 4))
{
printf("put in the ip addr string of server\r\n");
scanf("%s",str);
if(test_ipstr(str) != 1)
{
printf("ip addr error\r\n");
return;
}
printf("server ip addr %s\r\n",str);
}
switch(c)
{
case 1: /* blasterTCP 192.168.1.200 5000 1024 65535 */
setTargetNetAddr(0);
printf("blasteeTCP\n");
blasteeTCP(5000 + core_id, psize,65535,0);
break;
case 2: /* blasterUDP 192.168.1.200 5000 1024 65535 */
setTargetNetAddr(0);
printf("blasteeUDP\n");
blasteeUDP(5000 + core_id, psize,65535,0);
break;
case 3: /* blasteeTCP 5000 1024 65535 */
sleep(5);
setTargetNetAddr(1);
printf("blasterTCP\n");
blasterTCP(str, 5000 + core_id, psize, 65535, 0); // server ip
break;
case 4: /* blasteeUDP 5000 1024 65535 */
sleep(5);
setTargetNetAddr(1);
printf("blasterUDP\n");
blasterUDP(str, 5000 + core_id, psize, 65535, 0); // server ip
break;
default:
break;
}
return;
}
void net_test()
{
int c = 0;
int ret = 0;
printf("tcp blastee put in 1\n");
printf("udp blastee put in 2\n");
printf("tcp blaster put in 3\n");
printf("udp blaster put in 4\n");
scanf("%d",&c);
net_test_main(c,1024);
}
int main()
{
net_test();
return 0;
}