/* * Example of client using TCP protocol. */ #include #include #include #include #include #include /* Need fcntl.h to use fcntl() to make recvfrom non-blocking */ #include #include "message.h" #define MaxTries 25 /* Maximum Tries to Receive from Server */ #define SERV_HOST_ADDR "130.108.2.22" /* gamma's Internet address, defined in /etc/hosts */ // #define SERV_HOST_ADDR "156.12.23.5" // #define SERV_HOST_ADDR "156.12.1.120" /* pooh's Internet address, defined in /etc/hosts */ main(argc, argv) int argc; char *argv[]; { int sockfd, i, serlen,Count,err; struct sockaddr_in serv_addr,cli_addr; int SERV_TCP_PORT; char *pname; MES mes_out, mes_in, tmp; printf("Please input the same integer input to the ser program\n"); printf(" (which is larger than 1023)\n"); scanf("%d", &SERV_TCP_PORT); pname = argv[0]; /* create a socket which is one end of a communication channel */ if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("client: cannot open datagram socket"); exit(1); } /* specify server address */ bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; /* address family: Internet */ serv_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR); serv_addr.sin_port = htons(SERV_TCP_PORT); mes_out.mtype = htonl(getpid()); /* Make recvfrom() non-blocking */ // fcntl(sockfd,F_SETFL,FNDELAY); Old way fcntl(sockfd,F_SETFL,O_NONBLOCK); for(i=0; i<10; i++) { mes_out.number = htonl(i); if(sendto(sockfd, &mes_out, sizeof(MES),0, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) { perror("client: write"); exit(3); } sleep(1); Count=0; do { if ((err=recv(sockfd,&mes_in,sizeof(MES),0))<0) if (++Count < MaxTries) { sleep(1); if (!(Count % 5)) fprintf(stderr,"%dth Attempt to receive\n",Count); } else { perror("client: recv() failed after repeated attempts...Error is "); exit(4); } } while (err < 0 && Count < MaxTries); fprintf(stderr,"Received %d from server\n",ntohl(mes_in.number)); } close(sockfd); exit(0); }