From owner-p4-projects@FreeBSD.ORG Sun Jun 28 01:25:19 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 20CD1106566C; Sun, 28 Jun 2009 01:25:19 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BC7F71065674 for ; Sun, 28 Jun 2009 01:25:18 +0000 (UTC) (envelope-from fangwang@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id A99028FC14 for ; Sun, 28 Jun 2009 01:25:18 +0000 (UTC) (envelope-from fangwang@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5S1PIOJ026856 for ; Sun, 28 Jun 2009 01:25:18 GMT (envelope-from fangwang@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5S1PI4E026853 for perforce@freebsd.org; Sun, 28 Jun 2009 01:25:18 GMT (envelope-from fangwang@FreeBSD.org) Date: Sun, 28 Jun 2009 01:25:18 GMT Message-Id: <200906280125.n5S1PI4E026853@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to fangwang@FreeBSD.org using -f From: Fang Wang To: Perforce Change Reviews Cc: Subject: PERFORCE change 165334 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Jun 2009 01:25:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=165334 Change 165334 by fangwang@fangwang_utobsd on 2009/06/28 01:25:08 Impelement tcputo regression test code, not finish yet. Affected files ... .. //depot/projects/soc2009/tcputo/src/tools/regression/netinet/tcputo/Makefile#1 add .. //depot/projects/soc2009/tcputo/src/tools/regression/netinet/tcputo/tcputo.c#2 edit Differences ... ==== //depot/projects/soc2009/tcputo/src/tools/regression/netinet/tcputo/tcputo.c#2 (text+ko) ==== @@ -1,0 +1,179 @@ +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +static void +usage(void) +{ + + fprintf(stderr, "tcpconnect server port\n"); + fprintf(stderr, "tcpconnect client ip port\n"); + exit(-1); +} + +static int +tcputo_timer(void) +{ + static time_t start_time = 0; + time_t end_time; + time_t interval; + + if (start_time == 0) { + time(&start_time); + interval = 0; + } + else { + time(&end_time); + interval = end_time - start_time; + start_time = 0; + } + + return (int)(interval); +} + +static void +tcputo_server(int argc, char *argv[]) +{ + int listen_sock, accept_sock; + struct sockaddr_in sin; + char *dummy; + char buf[16*1024]; + long port; + int user_timeout; + int optval = 4*1024; + + if (argc != 1) + usage(); + + bzero(&sin, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_ANY); + + port = strtoul(argv[0], &dummy, 10); + if (port < 1 || port > 65535 || *dummy != '\0') + usage(); + sin.sin_port = htons(port); + + listen_sock = socket(PF_INET, SOCK_STREAM, 0); + if (listen_sock == -1) + err(-1, "socket"); + + if (bind(listen_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) + err(-1, "bind"); + + if (listen(listen_sock, -1) == -1) + err(-1, "listen"); + + accept_sock = accept(listen_sock, NULL, NULL); + close(listen_sock); + if (setsockopt(accept_sock, SOL_SOCKET, SO_SNDBUF, &optval, sizeof(optval)) == -1) + err(-1, "setsockopt"); + while(1) { + sleep(1); + printf("server again %d\n", optval++); + (void)recv(accept_sock, buf, 16*1024, MSG_DONTWAIT); + (void)tcputo_timer(); + if (send(accept_sock, buf, 16*1024, MSG_NOSIGNAL) >= 0) { + (void)tcputo_timer(); + continue; + } + puts(strerror(errno)); + user_timeout = tcputo_timer(); + printf("Connection timeout, %d seconds.\n", user_timeout); + break; + } + + close(accept_sock); +} + +static void +tcputo_client(int argc, char *argv[]) +{ + struct sockaddr_in sin; + long count, i, port; + char *dummy; + char buf[16*1024]; + int sock; + int nonblock = 0, md5enable = 0; + int user_timeout; + int optval = 4*1024; + + if (argc != 2) + usage(); + + bzero(&sin, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + if (inet_aton(argv[0], &sin.sin_addr) == 0) + err(-1, "convert address"); + + port = strtoul(argv[1], &dummy, 10); + if (port < 1 || port > 65535 || *dummy != '\0') + usage(); + sin.sin_port = htons(port); + + sock = socket(PF_INET, SOCK_STREAM, 0); + if (sock == -1) + err(-1, "socket"); + if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &optval, sizeof(optval)) == -1) + err(-1, "setsockopt"); + + /* No warning in default case on ENOPROTOOPT. */ + /* if (setsockopt(sock, IPPROTO_TCP, TCP_MD5SIG, + &md5enable, sizeof(md5enable)) != 0) { + if (errno == ENOPROTOOPT && md5enable > 0) + err(-1, "setsockopt(TCP_MD5SIG)"); + else if (errno != ENOPROTOOPT) + warn("setsockopt(TCP_MD5SIG)"); + } */ + + if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) + err(-1, "connect"); + + while (1) { + sleep(1); + printf("client again %d\n", optval++); + (void)recv(sock, buf, 16*1024, MSG_DONTWAIT); + (void)tcputo_timer(); + if (send(sock, buf, 16*1024, MSG_NOSIGNAL) > 0) { + (void)tcputo_timer(); + continue; + } + puts(strerror(errno)); + user_timeout = tcputo_timer(); + printf("Connection timeout, %d seconds.\n", user_timeout); + break; + } + + close(sock); +} + +int +main(int argc, char *argv[]) +{ + + if (argc < 2) + usage(); + + if (strcmp(argv[1], "server") == 0) + tcputo_server(argc - 2, argv + 2); + else if (strcmp(argv[1], "client") == 0) + tcputo_client(argc - 2, argv + 2); + else + usage(); + + exit(0); +}