#include #include #include #include #include #include #include #include #include #define sFALSE 0 #define sTRUE 1 #ifndef TCP_NODELAY #define TCP_NODELAY 1 #endif volatile int STOP = sFALSE; /*************************************************************************** * signal handler. * CTRL-C Handler fuer sauberes beenden ***************************************************************************/ void signal_handler_CTRL (int status) { STOP=sTRUE; printf("\n\n SIGNAL \n\n"); } /* end funktion signal_handler_CTRL */ int main(int argc, char *argv[]) { int i=0; char buf[128]; char sbuf[] = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; struct sockaddr_in server; // Socket-Adresse struct hostent *hp; // Host-Info int sockfd, sockoption; int ret; if ( argc < 3 ) { printf("Aufruf -> dmtest ServerIP Port\n"); exit (-1); } /* CTRL-C Handler einhaengen */ signal(SIGINT, signal_handler_CTRL); // Socket erzeugen sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { printf ("Unable to open stream socket\n"); exit(1); } sockoption = 1; if (setsockopt (sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &sockoption, sizeof(sockoption)) != 0) { printf("Failed to set socket option TCP_NODELAY\n"); exit (1); } // Hostnamen aufloesen server.sin_family = AF_INET; hp = gethostbyname(argv[1]); if (hp == 0) { printf("%s: unknown host\n", argv[1]); exit(1); } bcopy(hp->h_addr_list[0], &server.sin_addr, hp->h_length); server.sin_port = htons(atoi(argv[2])); // Verbindung herstellen: if (connect(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0) { printf("Unable to connect stream socket\n"); exit(1); } while (STOP==sFALSE) { int len, nleft, nread, rval; char *ptr; /* 1. command send a)length of command at first b)command 2. receive answer a)lenght of answer b)answer */ /* send the command */ printf("s"); fflush(stdout); /* 1a send length */ len = strlen(sbuf); rval = send(sockfd, (char *)&len, sizeof(int), 0); if (rval < 0 || rval != sizeof(int)) { printf("send Anfragelaenge fehlerhaft\n"); break; } printf("S"); fflush(stdout); /* 1b send command */ rval = send(sockfd, sbuf, len, 0); if (rval < 0 || rval != len) { printf("send Anfrage fehlerhaft\n"); break; } printf("r"); fflush(stdout); /* wait for the OK-answer from Server */ /* 2a read lenght of answer */ nleft = sizeof(int); ptr = (char *) &len; while (nleft > 0) { if ( (nread = recv(sockfd, ptr, nleft, 0)) < 0) { printf("ERROR recv\n"); exit (2); } /* end if return < 0 */ else if (nread == 0) break; nleft -= nread; ptr += nread; } /* end while length to receive */ if ( nleft ) { printf("Laenge fehlerhaft empfangen\n"); break; } if (len < 0 || len > 128 ) { printf("Laenge ist falsch\n"); break; } printf("R%d",len); fflush(stdout); /* 2b read answer */ nleft = len; ptr = (char *) buf; while (nleft > 0) { if ( (nread = recv(sockfd, ptr, nleft, 0)) < 0) { printf("ERROR recv\n"); exit (2); } /* end if return < 0 */ else if (nread == 0) break; nleft -= nread; ptr += nread; } /* end while length to receive */ if ( nleft ) { printf("Laenge fehlerhaft empfangen\n"); break; } buf[len] = 0; printf("->%d->%s\n", i++,buf); fflush(stdout); } /* end while */ ret = close ( sockfd ); printf("\nENDE DMTEST\n"); exit(1); }