/* client4.c client skeleton for ex4 16 */ /* gcc -o client4 client4.c -lnsl -lsocket -lresolv */ #include #include #include #include #include #include #include #include #include /* official network end-of-line is CR LF */ #define EOL "\r\n" /* size of the send/receive buffer */ #define MAXMSG 1000 /* this macro can be used to check errors, see server.c for examples */ #define ERRORCHECK(var, value, command) if (var == value) { \ perror(command); \ exit(1); \ } int main(int argc, char *argv[]) { int ssock; /* socket to server */ int numbytes, status; char rbuf[MAXMSG]; /* receive buffer */ char sbuf[MAXMSG*2]; /* send buffer */ struct hostent *he; struct sockaddr_in se_addr; /* server address */ int sin_size = sizeof(struct sockaddr_in); /* convenience constant */ int port = 9876; /* default port */ if (argc < 2) { fprintf(stderr,"usage: %s hostname [message] [port]\n", argv[0]); exit(1); } /* get server address */ he=gethostbyname(argv[1]); ERRORCHECK(he, NULL, "gethostbyname"); /* port as optional third parameter */ if (argc > 3) port = atoi(argv[3]); /* get socket */ ssock = socket(AF_INET, SOCK_STREAM, 0); ERRORCHECK(ssock, -1, "socket"); /* contruct address struct */ se_addr.sin_family = AF_INET; se_addr.sin_port = htons(port); /* NBO */ se_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(se_addr.sin_zero), '\0', 8); /* connect to the server */ status = connect(ssock, (struct sockaddr *)&se_addr, sin_size); ERRORCHECK(status, -1, "connect"); /* send something to server */ sprintf(sbuf, "%s%s", ((argc > 2) ? argv[2] : "Hello"), EOL); /* single send for short messages is ok */ numbytes = send(ssock, sbuf, strlen(sbuf), 0); if (numbytes == -1) { perror("send"); exit(1); } else if (numbytes != strlen(sbuf)) printf("Only %d bytes sent! Should have used repeated send...\n", numbytes); /* receive */ /* receive several times here !!! */ numbytes=recv(ssock, rbuf, MAXMSG-1, 0); ERRORCHECK(numbytes, -1, "recv"); /* terminate message to make a string */ rbuf[numbytes] = '\0'; printf("Received: %s",rbuf); close(ssock); return 0; }