/* 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); }