From a5d8de37e179270164e8f61c2d7f312251667404 Mon Sep 17 00:00:00 2001 From: HappyZ Date: Wed, 28 Sep 2016 00:41:39 -0700 Subject: [PATCH] bug fix; add server send normal tcp --- offloading_binaries/TCPServer/Makefile | 20 -- offloading_binaries/TCPServer/TCPServer | Bin 13472 -> 0 bytes offloading_binaries/TCPServer/main.c | 133 ----------- .../client_recv_normaltcp | Bin 12776 -> 12776 bytes .../client_recv_normaltcp/main.c | 10 +- .../client_recv_normaltcp/main.o | Bin 3248 -> 3240 bytes offloading_binaries/makeall.sh | 7 + .../server_send_normaltcp/Makefile | 18 ++ .../server_send_normaltcp/main.c | 221 ++++++++++++++++++ .../main.o | Bin .../server_m_send_normaltcp | Bin 0 -> 51780 bytes .../server_send_normaltcp | Bin 0 -> 14030 bytes 12 files changed, 250 insertions(+), 159 deletions(-) delete mode 100644 offloading_binaries/TCPServer/Makefile delete mode 100755 offloading_binaries/TCPServer/TCPServer delete mode 100644 offloading_binaries/TCPServer/main.c create mode 100644 offloading_binaries/server_send_normaltcp/Makefile create mode 100644 offloading_binaries/server_send_normaltcp/main.c rename offloading_binaries/{TCPServer => server_send_normaltcp}/main.o (100%) create mode 100755 offloading_binaries/server_send_normaltcp/server_m_send_normaltcp create mode 100755 offloading_binaries/server_send_normaltcp/server_send_normaltcp diff --git a/offloading_binaries/TCPServer/Makefile b/offloading_binaries/TCPServer/Makefile deleted file mode 100644 index 6f47b9e..0000000 --- a/offloading_binaries/TCPServer/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -CC = gcc -CFLAGS = -pie -fPIE -TARGET = TCPServer - -OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) -HEADERS = $(wildcard *.h) - -all: $(TARGET) - -%.o: %.c $(HEADERS) - $(CC) $(CFLAGS) -c $< -o $@ - -.PRECIOUS: $(TARGET) $(OBJS) - -$(TARGET): $(OBJS) - $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ - -clean: - -rm -f *.o - -rm -f $(TARGET) diff --git a/offloading_binaries/TCPServer/TCPServer b/offloading_binaries/TCPServer/TCPServer deleted file mode 100755 index cf04ffd4e32748f391316c7330444e6408eb005f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13472 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define ETH_P_IP 0x0800 /* Internet Protocol packet */ -#define ETH_ALEN 6 /* from */ -#define ETH_P_ALL 0x0003 - -#define MY_DEST_MAC0 0xba -#define MY_DEST_MAC1 0xf6 -#define MY_DEST_MAC2 0xb1 -#define MY_DEST_MAC3 0x71 -#define MY_DEST_MAC4 0x09 -#define MY_DEST_MAC5 0x64 - -#define DEFAULT_IF "wlan0" -#define BUF_SIZ 8192 - -int main(int argc, char *argv[]) -{ - int slotLength = 10000; // in microseconds - int quota = 1000000000; // Bytes per slot, default 1GB/slot - int sentInSlot = 0, slot = 1; - double elapsedTime; - - struct iovec iov; - int sockfd, listenfd; - struct ifreq if_idx; - struct ifreq if_mac; - int tx_len = 0; - char sendbuf[BUF_SIZ]; - struct ether_header *eh = (struct ether_header *) sendbuf; - struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); - struct sockaddr_ll socket_address; - char ifName[IFNAMSIZ]; - int i, j, ret, sendsize=1488, packet_num=1000000000, offset = 0, port; - int fd; /* file descriptor for file to send */ - struct sockaddr_in servaddr,cliaddr; - socklen_t clilen; - struct timeval t_start,t_end,t_now; - - signal(SIGPIPE, SIG_IGN); - - if (argc > 1) - port = atoi(argv[1]); - else - { - printf("Usage: TCPServer port rate"); - exit(1); - } - - if (argc > 2) - quota = atoi(argv[2]) / (1000000 / slotLength); - - - listenfd = socket(AF_INET, SOCK_STREAM, 0); - - - bzero(&servaddr,sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - servaddr.sin_port = htons(port); - bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); - listen(listenfd, 1); - - for(;;) - { - clilen=sizeof(cliaddr); - sockfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen); - printf("Accepted.\n"); - //setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int)); - - gettimeofday(&t_start, NULL); - while (offset < packet_num) - { - if ((packet_num - offset) < quota) - { - quota = packet_num - offset; - } - while (sentInSlot < quota) - { - ret = send(sockfd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096, 0); - if (ret <= 0) - { - printf("send fail\n"); - slot = 1; - sentInSlot = 0; - offset = 0; - goto RESTART; - } - offset += ret; - sentInSlot = sentInSlot + ret; - } - gettimeofday(&t_now, NULL); - elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); - //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); - if (elapsedTime < slotLength * slot) - { - usleep((int)(slotLength * slot - elapsedTime)); - } - sentInSlot = 0; - slot++; - - } -RESTART: - close(sockfd); - gettimeofday(&t_end, NULL); - printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); - } - - close(fd); - - return 0; -} diff --git a/offloading_binaries/client_recv_normaltcp/client_recv_normaltcp b/offloading_binaries/client_recv_normaltcp/client_recv_normaltcp index 3583e5662862e4fa66d7c8113db62d5425c8e04e..87af88f2ce4628251fa8daec17ecf765f9091144 100755 GIT binary patch delta 895 zcmZ9JO=uHA6vy9evdQiyl{9H>%4)N1K5D2mTlJu|Vu}cX94zQf3&r-}L2r5!EZV~g z6(cX8w=SY!A(d$GBvL&H^$R>y5wVaDmevL&3f_wAn`YIRf!Ueg{QvVlW;docrgL-R zY6xKU(e>LR8^eCjVdln3&r|yLdWSIV_2Y#1a`&Bm3zkd2S$2V0VF9zIX=cs9iuV}H zU|bsN2yg58^#^dR+J%$S>9_{)TD9#u=w=0Uv;a=l+yKhXmNNlgNs)1ZP9gxCeKe&% z>T|SCjqse!n9V)q515shrdocA`u&$(XJFPoV^U5X`au-aRVzTMOTStU=sxR(ZEue0 z*($FZsOmC##z;RvK0%+}?&cfbl2x{jOL9-IsV`WM8Pq|eE-8bX?unFf5Z7ci`3C+e z0x7(fF9X?%*>aWQ(zT#%j>7l^Vb>nQT-v&8Xzi^bWHu z#(lj3t*TFdyAK!3?Kt8)(WC;rQ*C<OCuL`=caf;Hq1W!DXQ!Pc@)$n_u+dro^|cL zIYx2Ye;~`MwbYd{Z&F|Fpjvah+f=6P*N4kTbj5PR@d^X@(oEU|JSK(0m;C@^jR2dr zZ4bEs{z$~M&rkIYO%^Umwo5{{{2`YlG6BU-n*>1IeJOHqhlpy$^kp`TnByO69b1U&J%J9(PIB^;`y6tm( z3ck2&mR|G3j~&-s9WT^ndCRj<)tD3inYgx#GVwI&gO0vl$D0gJ!ACNjaSRd_uH_K% y3h5^uJzB>}V*dH#bn*dGb$p0;zVNBXE3gS%?u!Wg_lwAqQGx&RVxcFw;Q9xlbn3YP diff --git a/offloading_binaries/client_recv_normaltcp/main.c b/offloading_binaries/client_recv_normaltcp/main.c index 37e75bc..9c106b4 100644 --- a/offloading_binaries/client_recv_normaltcp/main.c +++ b/offloading_binaries/client_recv_normaltcp/main.c @@ -52,8 +52,8 @@ int main(int argc, char *argv[]) sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = inet_addr(argv[2]); - servaddr.sin_port = htons(atoi(argv[3])); + servaddr.sin_addr.s_addr = inet_addr(argv[1]); + servaddr.sin_port = htons(atoi(argv[2])); // connect socket if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) @@ -84,8 +84,8 @@ int main(int argc, char *argv[]) if (ret <= 0) { - if (errno == 0) - { + if (errno == 0 || errno == 2) + { if (argc > 4) close(fd); break; @@ -109,8 +109,6 @@ int main(int argc, char *argv[]) total_bytes_recv, elapsedTime, total_bytes_recv * 8 / elapsedTime); close(sockfd); - if (argc > 4) - close(fd); return 0; } diff --git a/offloading_binaries/client_recv_normaltcp/main.o b/offloading_binaries/client_recv_normaltcp/main.o index e22cc65a5e5b9c559e361c99dcaa51d5ae990a1c..10c288af4f86491ee36e0066dd4167d194e818f1 100644 GIT binary patch delta 495 zcmYk%KP&@r6bJC{yStY3loR!*oVX*>fzVn=SOf{1M1@2eIx~<+*bp5ILNCuylN(74 z5=8$lo&c|41)Ko4la55{NDHO{eHhYiylX_4&8e0APsq`K{C98VRx;RO- z?9p0%uJ7ngkMBR}@Sn-@^N!=^ceqs>p>a-YUE!wE`-AsmY`;YKP@C&?fV=OXp913k zGvfRPOyvzA^gq)$p!bK93AOj%Y?3GRdAjBkeTIA{V@~!@8Eu?1to8vJcch?8$uq10 zzSI{1o0*8DpYs*bC>5ck6t=d+z!3-Mo2fW^F3CopG9Q({T#9hZj`CGt}ok z7@VbzW^eGQtULS9I=mtoUdgt-QkL7bBu(*x)>mg&>IZLm?7UcfsHGYsz}?U9?*|;O z2#3pHQy;Ed9Z-Az`&K!v&(RHE>9cgn&4Cmx@>-yShcsi1fTu7bWq(6S`GyLUFV5c8 z`*;B8k*Lv8ISCEOOSDRC@AfA~&aMMX8m)7zdWUjnC)F$3)~D1g3;0&-ka?N4FBXX +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUF_SIZ 65536 + +char isNumber(char number[]) +{ + int i = 0; + + //checking for negative numbers + if (number[0] == '-') + i = 1; + for (; number[i] != 0; i++) + { + //if (number[i] > '9' || number[i] < '0') + if (!isdigit(number[i])) + return 0; + } + return 1; +} + +int main(int argc, char *argv[]) +{ + // defaults + uint slotLength = 10000; // in microseconds, for bandwidth control + uint quota = 1000000000; // default bytes per slot, default 1GB/slot + uint sentInSlot = 0, slot = 1; + uint total_bytes_sent = 0; + // for timing + double elapsedTime; + struct timeval t_start, t_end, t_now; + // for socket + int fd; // file descriptor of file to send + int listenfd, sockfd; // socket + char sendbuf[BUF_SIZ]; + struct sockaddr_in servaddr, cliaddr; + socklen_t clilen; + // for misc + int ret; + int sendsize = 1460; // 1500 MTU - 20 IPv4 - 20 TCP + uint bytes2send = 0; + struct stat st; + unsigned char listenOnce = 0; + + signal(SIGPIPE, SIG_IGN); + + if (argc < 3) + { + printf("Usage: %s <[optional] bandwidth (bps)> <[optional] listenOnce ([0]/1)> <[optional] sendsize (bytes)>\n", argv[0]); + exit(0); + } + + // set bandwidth + if (argc > 3) + quota = atoi(argv[3]) / 8 / (1000000 / slotLength); + + // only one session + if (argc > 4) + listenOnce = atoi(argv[4]); + + // set sendsize (if larger than 1460 will do packetization (fragmentation)) + if (argc > 5) + sendsize = atoi(argv[5]); + + // adjust slotLength to address packet size issue in the end + if ((quota % sendsize) > 0) + { + // printf("quota:%d,sendsize:%d,slotLength:%d\n", quota, sendsize, slotLength); + slotLength = (uint)((double)(quota / sendsize + 1) * sendsize / quota * slotLength); + quota = (quota / sendsize + 1) * sendsize; + // printf("quota:%d,sendsize:%d,slotLength:%d\n", quota, sendsize, slotLength); + } + + // listen to socket + listenfd = socket(AF_INET, SOCK_STREAM, 0); + // bind socket and listen + bzero(&servaddr, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(atoi(argv[1])); + bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); + listen(listenfd, 1); + + for (;;) + { + clilen = sizeof(cliaddr); + + // wait for one client and accept it once found + sockfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen); + printf("Accepted client at %s\n", inet_ntoa(cliaddr.sin_addr)); + + // get file size (bytes2send) + if (isNumber(argv[2])) + { + // set bytes to send + bytes2send = atoi(argv[2]); + // open file descriptor + fd = open("/dev/zero", O_RDONLY); + if (fd == -1) + { + fprintf(stderr, "! Unable to open /data/local/tmp/bigfile.\n"); + exit(1); + } + } + else + { + // open file descriptor + fd = open(argv[2], O_RDONLY); + if (fd == -1) + { + fprintf(stderr, "! Unable to open file %s.\n", argv[2]); + exit(1); + } + fstat(fd, &st); + bytes2send = st.st_size; + printf("bytes2send:%d\n", bytes2send); + } + // clear total_bytes_sent to 0 + total_bytes_sent = 0; + sentInSlot = 0; + slot = 1; + + // start timing + gettimeofday(&t_start, NULL); + + // start to send + while (total_bytes_sent < bytes2send) + { + if ((bytes2send - total_bytes_sent) < quota) + { + quota = bytes2send - total_bytes_sent; + } + // send in slots + while (sentInSlot < quota) + { + // printf( + // "before: total_bytes_sent %d, sentInSlot %d, quota - sentInSlot %d\n", + // total_bytes_sent, sentInSlot, quota - sentInSlot); + read(fd, sendbuf, (quota - sentInSlot < sendsize) ? (quota - sentInSlot) : sendsize); + ret = send( + sockfd, sendbuf, + (quota - sentInSlot < sendsize) ? (quota - sentInSlot) : sendsize, 0); + + if (ret <= 0) + { + fprintf(stderr, "! Fail to send: ret:%d, err:%d; wait for 100us..\n", ret, errno); + total_bytes_sent = bytes2send + 1; + break; + } + total_bytes_sent += ret; + sentInSlot += ret; + // printf( + // "after: total_bytes_sent %d, sentInSlot %d, quota - sentInSlot %d\n", + // total_bytes_sent, sentInSlot, quota - sentInSlot); + } + // workaround to break the while loop when error happens + if (total_bytes_sent > bytes2send) + { + break; + } + // control bandwidth + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec - t_start.tv_sec) * 1000000.0 + (t_now.tv_usec - t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + // printf( + // "sent %d, quota %d, bytes2send %d, usleep %lfus\n", + // total_bytes_sent, quota, bytes2send, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + ++slot; + } + + // end timing + if (total_bytes_sent == bytes2send) + { + gettimeofday(&t_end, NULL); + elapsedTime = (t_end.tv_sec - t_start.tv_sec) + (t_end.tv_usec - t_start.tv_usec) / 1000000.0; + printf( + "sent(bytes):%d\nduration(s):%lf\nthroughput(bps):%lf\n", + total_bytes_sent, elapsedTime, total_bytes_sent * 8 / elapsedTime); + } + else + { + fprintf(stderr, "! error: total_bytes_sent > bytes2send\n"); + } + + close(sockfd); + close(fd); + + if (listenOnce) + break; + } + + close(listenfd); + + return 0; +} \ No newline at end of file diff --git a/offloading_binaries/TCPServer/main.o b/offloading_binaries/server_send_normaltcp/main.o similarity index 100% rename from offloading_binaries/TCPServer/main.o rename to offloading_binaries/server_send_normaltcp/main.o diff --git a/offloading_binaries/server_send_normaltcp/server_m_send_normaltcp b/offloading_binaries/server_send_normaltcp/server_m_send_normaltcp new file mode 100755 index 0000000000000000000000000000000000000000..90506ce9e8ba13c81f6b0fc976cab8e48a8f1746 GIT binary patch literal 51780 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/server_send_normaltcp/server_send_normaltcp b/offloading_binaries/server_send_normaltcp/server_send_normaltcp new file mode 100755 index 0000000000000000000000000000000000000000..ab0c1192eb6b91f2ce68fcd7c67082970fd84695 GIT binary patch literal 14030 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