/* tcp.master.c SJ */ /* gcc -Wall -o tcp.master tcp.master.c -lnsl -lsocket -lresolv */ /* usage: tcp.master hostname:port hostname:port ... */ #include #include #include #include #include #include #include #include #include #include void sendall(int sock, char *buf); void receiveandprintall(int sock); int makeconnect(char *addr, int port); int main(int argc, char **argv) { int socks[100], sock; int slaves = 0; char **param, *colon; int i, k; char mesg1[100]; param = argv+1; while (*param) { if (colon = strchr(*param, ':')) { *colon = '\0'; sock = makeconnect(*param, atoi(colon+1)); if (sock != -1) socks[slaves++] = sock; } param++; } printf("got %d slaves\n", slaves); /* send request to each slave */ for (i = 0; i < slaves; i++) { k = rand()%5 + 1; sprintf(mesg1, "%d\n", k); sendall(socks[i], mesg1); } /* receive from all slaves */ for (i = 0; i < slaves; i++) receiveandprintall(socks[i]); return 0; } void sendall(int sock, char *buf) { int len, bs; len = strlen(buf); while (len > 0) { bs = send(sock, buf, len, 0); if (bs == -1) { perror("send"); return; } else if (bs == 0) { printf("Connection closed prematurely\n"); return; } len -= bs; } } /* sendall() */ void receiveandprintall(int sock) { int numbytes; char buf[1000]; while ((numbytes = recv(sock, buf, 1000-1, 0))) { if (numbytes == -1) { perror("recv"); exit(1); } buf[numbytes] = '\0'; /* terminate string */ fputs(buf, stdout); } close(sock); } /* returns socket */ int makeconnect(char *addr, int port) { struct sockaddr_in slave_addr; int sock; struct hostent *host; host=gethostbyname(addr); if (!host) { herror("gethostbyname"); return -1; } if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); return -1; } slave_addr.sin_family = AF_INET; // host byte order slave_addr.sin_port = htons(port); // short, network byte order slave_addr.sin_addr = *(struct in_addr*)(host->h_addr); // copy address memset(&(slave_addr.sin_zero), '\0', 8); // zero the rest of the struct if (connect(sock, (struct sockaddr *)&slave_addr, sizeof(struct sockaddr)) == -1) { perror("connect"); return -1; } return sock; }