/* AsiakasEsimerkki.c SJ */ /* gcc -o AsiakasEsimerkki AsiakasEsimerkki.c -lnsl -lsocket -lresolv */ #include #include #include #include #include #include #include #include #include /* verkossa pitäisi käyttää CR LF */ #define EOL "\r\n" /* puskurikoko */ #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 != 3) { fprintf(stderr,"usage: %s hostname port\n", argv[0]); exit(1); } /* get server address */ he=gethostbyname(argv[1]); ERRORCHECK(he, NULL, "gethostbyname"); port = atoi(argv[2]); /* 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, "%d%s", 5, 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("%s",rbuf); close(ssock); return 0; }