/*********************************** * *client.c * **********************************/ #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> #include<sys/wait.h> #include<unistd.h> #include<arpa/inet.h> #include<resolv.h> #define MAXSIZE 1024 //**************main()************** int main(int argc,char *argv[]) { int sockfd; int n; char recv_buf[MAXSIZE+1]; char send_buf[MAXSIZE+1]; struct timeval tv; fd_set readfd; // 参数判断 if ( argc != 3 ) { printf("USAGE: %s [serv_address][serv_port]/n", argv[0]); exit(1); } // 创建IPV6型的socket if ( (sockfd = socket(PF_INET6, SOCK_STREAM, 0)) < 0 ) { perror("socket"); exit(1); } // 转换服务器IP地址 struct sockaddr_in6 serv_addr; bzero(&serv_addr,sizeof(serv_addr)); serv_addr.sin6_family = AF_INET6; serv_addr.sin6_port = htons( atoi(argv[2]) ); if ( inet_pton(AF_INET6, argv[1], &serv_addr.sin6_addr ) < 0 ) { perror(argv[1]); exit(1); } // 与服务器建立连接 if ( connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr) ) < 0 ) { perror("connect"); exit(1); } printf("Connected to server/n"); while (1) { //----------set last time--------- tv.tv_sec=600; tv.tv_usec=0; FD_ZERO(&readfd); // 将标准输入和与服务连接的文件句柄读事件加入SET FD_SET(0,&readfd); FD_SET(sockfd,&readfd); // 检查是否有读事件发生 if ( select( sockfd+1, &readfd, NULL, NULL, &tv) <= 0 ) { fprintf(stderr,"/n time out/n"); break; } // 如果标准输入中有数据可读,则从其中读取数据,并向服务器发送 if ( FD_ISSET(0,&readfd) ) { if( (n = read(0, send_buf, MAXSIZE-1)) <= 0 ) { break; } send_buf[n]='/n'; if ( send( sockfd, send_buf, n, 0) <= 0) { perror("send"); break; } } // 如果有从服务器发送过来的数据,则将其读取出来,并输出到标准输出 if ( FD_ISSET(sockfd, &readfd) ) { if ( ( n = recv(sockfd, recv_buf, MAXSIZE-1, 0)) <= 0 ) { fprintf(stderr,"connection closed./n"); exit(1); } recv_buf[n]='/0'; printf("recved:%s", recv_buf); fflush(stdout); } } close(sockfd); return 0; }