/*
client server model [client]
enviroment : TEST_PORT .. port no. of socket
TEST_HOST .. host name for server
> cli
12345 <-- input
12345 --> echo from server
C_Quit <-- input
cli quit
C_Close <-- input
client close
DS_C_Quit <-- input
client and dedicated server quit
*/
#include "tcp.h"
char *uname;
int main(int argc,char *argv[]) {
int sockfd,ret,newsockfd,clilen,childpid;
struct sockaddr_in srv_addr,cli_addr;
struct hostent *ent;
struct in_addr *ip;
uname = argv[0];
PRT_TRS("s:socket()\n");
if (( sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
die_err(1);
}
PRT_TRS("e:socket()\n");
/* set addr */
get_env(); /* get host_name/port_no */
ent = gethostbyname(host_nm);
if (! ent) die_err(30);
{
u_char a1,a2,a3,a4;
ip = (struct in_addr *)ent->h_addr_list[0];
if (! ip) die_err(35);
printf("Server Host [%s] ",host_nm);
#ifdef SUN
a1 = ip->s_net;
a2 = ip->s_host;
a3 = ip->s_lh;
a4 = ip->s_impno;
printf("is %d.%d.%d.%d\n",a1,a2,a3,a4);
#endif
}
bzero((char *) &srv_addr,SZ_ADDR);
srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.s_addr = ip->s_addr;
srv_addr.sin_port = htons(port_no);
PRT_TRS("s:connect()\n");
ret = connect(sockfd,(struct sockaddr *) &srv_addr,SZ_ADDR);
PRT_TRS("e:connect()\n");
if (ret == -1) die_err(2);
ret = str_cli(stdin,sockfd);
if (ret != CLOSED) close(sockfd);
exit(0);
}
int str_cli(FILE *fp,int sockfd) {
int n,ret=0;
char sendline[MAX_LINE],recvline[MAX_LINE+1];
while (fgets(sendline,MAX_LINE,fp) != NULL) {
if (! strcmp(sendline,C_QUIT)) return ret;
n = strlen(sendline);
if (writen(sockfd,sendline,n) != n) die_err(10);
n = readline(sockfd,recvline,MAX_LINE);
if (n < 0) die_err(12);
recvline[n] = 0;
printf("Back string : %s",recvline);
if (! strcmp(sendline,DS_C_QUIT)) return ret;
if (! strcmp(sendline,C_CLOSE)) {
close(sockfd);
ret = CLOSED;
}
if (! strcmp(sendline,CQUIT_SWQUIT)) {
close(sockfd);
ret = CLOSED;
return ret;
}
}
if (ferror(fp)) die_err(13);
}
int readline(int fd,char *ptr, int maxlen) {
int n,rc;
char c;
for (n=1; n<maxlen; n++) {
if ((rc = read(fd,&c,1)) == 1) {
*ptr++ = c;
if (c == '\n') break;
}
else if (rc == 0) {
if (n == 1) return (0);
else break;
} else return (-1);
}
*ptr = 0;
return (n);
}
int writen(int fd,char *ptr,int nbytes) {
int nleft,nwritten;
nleft = nbytes;
while (nleft > 0) {
nwritten = write(fd,ptr,nleft);
if (nwritten <= 0) return (nwritten);
nleft -= nwritten;
ptr += nwritten;
}
return (nbytes - nleft);
}
void usage() {
}
void die_err(int no) {
perror(uname);
exit(no);
}