|
@@ -0,0 +1,151 @@
|
|
|
+#include <stdio.h>
|
|
|
+#include <time.h>
|
|
|
+
|
|
|
+#if defined(_WIN32) || defined(WIN32)
|
|
|
+#include <Windows.h>
|
|
|
+void INIT(void) {WSADATA wsaData; WSAStartup(MAKEWORD(2,2), &wsaData);}
|
|
|
+#else
|
|
|
+#define INIT()
|
|
|
+#include <unistd.h>
|
|
|
+#include <netdb.h>
|
|
|
+#include <sys/types.h>
|
|
|
+#include <sys/socket.h>
|
|
|
+#include <netinet/in.h>
|
|
|
+#endif
|
|
|
+
|
|
|
+int connect_to_server(const struct sockaddr_in * serv_addr)
|
|
|
+{
|
|
|
+ int sockfd;
|
|
|
+
|
|
|
+ /* Create a socket */
|
|
|
+ sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
+ if (sockfd < 0) {
|
|
|
+ perror("ERROR opening socket");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Connect to the server */
|
|
|
+ if (connect(sockfd, (const sockaddr *)serv_addr, sizeof(*serv_addr)) < 0) {
|
|
|
+ perror("ERROR connecting");
|
|
|
+ close(sockfd);
|
|
|
+ return -2;
|
|
|
+ }
|
|
|
+
|
|
|
+ return sockfd;
|
|
|
+}
|
|
|
+
|
|
|
+int send_to_server(int conn, const char * request)
|
|
|
+{
|
|
|
+ int req_len = strlen(request);
|
|
|
+ int n;
|
|
|
+
|
|
|
+ n = write(conn, request, req_len);
|
|
|
+ if (n < 0) {
|
|
|
+ perror("ERROR writing to socket");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return (n==req_len);
|
|
|
+}
|
|
|
+
|
|
|
+int read_from_server(int conn)
|
|
|
+{
|
|
|
+ char rbuffer[1024];
|
|
|
+ int n;
|
|
|
+ long ret;
|
|
|
+
|
|
|
+ n = read(conn, rbuffer, sizeof(rbuffer));
|
|
|
+ if (n < 0) {
|
|
|
+ perror("ERROR reading from socket");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (strncmp("HTTP/1.", rbuffer, 7)) {
|
|
|
+ perror("ERROR not a HTTP response");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = atol(rbuffer + 9);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int main(int argc, char *argv[])
|
|
|
+{
|
|
|
+ long portno;
|
|
|
+ int i, con_count=1;
|
|
|
+ time_t t1,t2,t3,t4;
|
|
|
+ char wbuffer[256];
|
|
|
+ int connlist[1024*65];
|
|
|
+ int result[1024*65];
|
|
|
+ struct hostent *server;
|
|
|
+ struct sockaddr_in serv_addr;
|
|
|
+
|
|
|
+ INIT();
|
|
|
+
|
|
|
+ if (argc != 4) {
|
|
|
+ fprintf(stderr,"Usage:\n\t%s hostname port clients\n\n", argv[0]);
|
|
|
+ exit(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ con_count = atol(argv[3]);
|
|
|
+ if (con_count<1) con_count=1;
|
|
|
+ if (con_count>1024*65) con_count=1024*65;
|
|
|
+
|
|
|
+ portno = atol(argv[2]);
|
|
|
+ if (portno<1l || portno>0xFFFFl) {
|
|
|
+ fprintf(stderr, "ERROR, invalid port\n");
|
|
|
+ exit(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ server = gethostbyname(argv[1]);
|
|
|
+ if (server == NULL) {
|
|
|
+ fprintf(stderr, "ERROR, no such host\n");
|
|
|
+ exit(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(&serv_addr, 0, sizeof(serv_addr));
|
|
|
+ serv_addr.sin_family = AF_INET;
|
|
|
+ memcpy(server->h_addr, &serv_addr.sin_addr.s_addr, server->h_length);
|
|
|
+ serv_addr.sin_port = htons((short)portno);
|
|
|
+
|
|
|
+ sprintf(wbuffer, "GET / HTTP/1.0\r\n\r\n");
|
|
|
+
|
|
|
+ t1 = time(0);
|
|
|
+ for (i=0;i<con_count;i++) {
|
|
|
+ result[i] = connlist[i] = connect_to_server(&serv_addr);
|
|
|
+ }
|
|
|
+ t2 = time(0);
|
|
|
+ for (i=0;i<con_count;i++) {
|
|
|
+ if (result[i]>=0) {
|
|
|
+ result[i] = send_to_server(connlist[i], wbuffer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ t3 = time(0);
|
|
|
+ for (i=0;i<con_count;i++) {
|
|
|
+ if (result[i]>=0) {
|
|
|
+ result[i] = read_from_server(connlist[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ t4 = time(0);
|
|
|
+
|
|
|
+ printf("\n");
|
|
|
+ printf("conn: %.0lf\n", difftime(t2,t1));
|
|
|
+ printf("write: %.0lf\n", difftime(t3,t2));
|
|
|
+ printf("read: %.0lf\n", difftime(t4,t3));
|
|
|
+
|
|
|
+ for (i=-10;i<1000;i++) {
|
|
|
+ int j,cnt=0;
|
|
|
+ for(j=0;j<con_count;j++) {
|
|
|
+ if (result[j]==i) cnt++;
|
|
|
+ }
|
|
|
+ if (cnt>0) {
|
|
|
+ printf("%5i\t%7u\n", i, cnt);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|