単純な client program †前節の単純なserver programの client は telnet で十分なのだが、 プログラムの考察という意味で、対応する client program を書いて みよう。一般に client program の方が簡単単純なはずなのだが、ここでは host名(argv[1])からアドレスを得る部分に多くのコードを使うはめに なっている。 #include <stdio.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <arpa/inet.h> #define MYBUFSIZE 128 int main(int argc, char* argv[]) { int s; int n; struct hostent *hp; struct sockaddr_in sa; unsigned long inaddr; int port; static char buf[MYBUFSIZE + 1]; if(argc != 3) { fprintf(stderr,"Usage: %s host port\n", argv[0]); return (-1); } port = atoi(argv[2]); memset((char*)&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons((unsigned short)port); if((inaddr = inet_addr(argv[1])) != INADDR_NONE) memcpy((char*)&sa.sin_addr, (char*)&inaddr, sizeof(inaddr)); else { if((hp = gethostbyname(argv[1])) == NULL) { fprintf(stderr, "Host %s is unknown\n", argv[1]); return (-1); } if(hp->h_addrtype != AF_INET) { fprintf(stderr, "Host %s has no Internet address\n", argv[1]); return (-1); } memcpy((char*)&sa.sin_addr, (char*)hp->h_addr, hp->h_length); } if((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "Cannot create socket.\n"); return 1; } if(connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { fprintf(stderr, "Cannot connect to %s:%d\n", argv[1], port); close(s); return 1; } while((n = recv(s, buf, MYBUFSIZE, 0)) > 0) { buf[n] = 0; printf( "%s", buf ); } close(s); return 0; } |