写服务器时常用来测试的client程序。 实现 connect 服务器, 接收打印输出服务器信息, 接收从键盘输入数据并发送给server 。 #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> int main(int argc, char *argv[]) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; int ret; fd_set fdSum; //文件描述符集的定义 struct timeval time_tv; time_tv.tv_sec = 10; time_tv.tv_usec =0; int maxsocket; if(argc!=3) { fprintf(stderr,"Usage:%s hostname portnumber/a/n",argv[0]); exit(1); } if((host=gethostbyname(argv[1]))==NULL) { fprintf(stderr,"Gethostname error/n"); exit(1); } if((portnumber=atoi(argv[2]))<0) //"1025"-->1025 { fprintf(stderr,"Usage:%s hostname portnumber/a/n",argv[0]); exit(1); } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket Error:%s/a/n",strerror(errno)); exit(1); } bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(portnumber); server_addr.sin_addr=*((struct in_addr *)host->h_addr); if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Connect Error:%s/a/n",strerror(errno)); exit(1); } printf("rect......./n"); while(1) { FD_ZERO(&fdSum); //清除描述符集 FD_SET(sockfd,&fdSum); //把serverFd加入描述符集 FD_SET(0,&fdSum); //把serverFd加入描述符集 time_tv.tv_sec = 10; time_tv.tv_usec =0; ret = select(sockfd +1,&fdSum,NULL,NULL,&time_tv); if(ret <0) { perror("select error!/n"); break; } else if(ret ==0) { printf("select timeout/n"); continue; } if(FD_ISSET(sockfd,&fdSum)) { if((nbytes=recv(sockfd,buffer,1024,0))==-1) { fprintf(stderr,"Read Error:%s/n",strerror(errno)); exit(1); } buffer[nbytes]='/0'; printf("I have received:%s recv nbytes = %d/n",buffer,nbytes); } if(FD_ISSET(0,&fdSum)) { char msgg[80],*pp; memset(msgg,0,sizeof(msgg)); pp=fgets(msgg,80,stdin); if((nbytes=send(sockfd,pp,strlen(pp),0))==-1) { fprintf(stderr,"send Error:%s/n",strerror(errno)); exit(1); } printf("send size = %d/n",nbytes); } }//while close(sockfd); exit(0); }