⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test12_5.txt

📁 linux under the C programming which complementary with the book of <linux under the C programming
💻 TXT
字号:
/*客户端代码*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
//#include <unp.h>
#include <sys/time.h>
#define MAXSIZE 80
void str_cli(FILE *,int)

int main(int argc,char **argv)
{
  	int sockfd,ret,len;
  	struct sockaddr_in ser_addr;
  	char *myname;
  	struct hostent *sh;
  	struct in_addr **addrs;

  	if(argc!=2){
		printf("parameters not match.");
		exit(0);
  	}
  /*判断参数是否匹配 */
  	if((sh=gethostbyname(argv[1]))==NULL){
    		printf("error when gethostbyname");
    		exit(0);
  	}
  /* 根据服务器名获得详细信息*/
  	addrs=(struct in_addr **)sh->h_addr_list;
	for(;*addrs!=NULL;addrs++){
   		sockfd=socket(AF_INET,SOCK_STREAM,0);
  		if(sockfd<0){
      			printf("error in socket");
     		 	exit(1);
   		}
   /* 创建套接口*/
 		ser_addr.sin_family=AF_INET;
 		ser_addr.sin_port=sh->h_port;
 		memcpy(ser_addr,sin_addr,*addrs,sizeof(struct in_addr));
 		bzero(&(ser_addr.sin_zero),8);
		ret=connect(sockfd,(SA *)&ser_addr,sizeof(struct sockaddr));
 		if(ret==0)
    			break;
/* 连接成功则跳出循环*/
 		else {
      			printf("error connecting");
      			close(sockfd);
  		}
	}
/*尝试与服务器的各个地址连接,知道连接上其中一个为止 */
	if(*addrs==NULL){
     		printf("can’t get connected with server");
     		exit(0);
 	}
 /*连接不成功则报错并退出 */
	str_cli(stdin,sockfd);
/*数据传输操作 */
	close(sockfd);
	exit(0);
}

void str_cli(FILE *fp,int sockfd,struct addr *addr,int addrlen)
{
   	char sends[MAXSIZE],recvs[MAXSIZE];
   	int n=0,maxfd;
   	fd_set aset;
   	FD_ZERO(&aset);
   	FD_SET(fileno(fp),&aset);
   	FD_SET(sockfd,&aset);
   	maxfd=max(fileno(fd),sockfd)+1;
   	select(maxfd,&aset,NULL,NULL,NULL);
   /*选择I/O */
   	while(true)
   	{
       		if(FD_ISSET(sockfd,&aset)){
             		if((n=recv(sockfd,recvs,MAXSIZE,0))==0){
                   		printf("error receiving data");
                   		exit(1);
              		}
              		recvs[n]=0;
             /*加上字符串结束标记 */
              		fputs(recvs,stdout);
        	}
        /*从套接口接收数据的处理 */
        	if(FD_ISSET(fp,&asset)){
              		if(fgets(sends,MAXSIZE,fp)==NULL)
                   		return;
              /*如果读到空字符串,结束数据处理函数 */
              		sendt(sockfd,sends,strlen(sends),0);
          	}
            /*从标准输入读入数据的处理 */
     	}
}


/*服务器端代码*/
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
//#include <unp.h>
#include <sys/time.h>
#include <sys/select.h>
#define MYPORT 3490
#define BACKLOG 10
#define BUFSIZE 100
#define MAXSELECT 100
#define MAXSIZE=80

main ( )
{
    	int sockfd,con_fd,sock,numbytes,ret,maxfd,maxi,I,nready;
    	int client[MAXSELECT];
    	fd_set *allset,rset;
    	struct sockaddr_in my_addr;
    	struct sockaddr_in their_addr;
    	int sin_size;
    	char *buf;
    	char revcs[MAXSIZE];

    	sockfd=socket(AF_INET,SOCK_STREAM,0);
    	if(sockfd<0){
         	printf("error in socket");
         	exit(1);
     	}
     	/*创建监听套接口 */
     	my_addr.sin_family=AF_INET;
     	my_addr.sin_port=htons(MYPORT);
     	my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
     	bzero(&(my_addr.sin_zero),8);
     	ret=bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
     	if(ret<0){
          	printf("error in binding");
          	exit(1);
      	}
      /*绑定监听套接口 */
       	ret=listen (sockfd,BACKLOG);
       	if(ret<0){
          	printf("error in listening");
          	exit(1);
      	}
     /* 监听连接请求*/
       	maxfd=listenfd;
       	maxi=-1;
       	for(i=0;i<MAXSELECT;i++)
             	client[i]=0;
       	FD_ZERO(&allset);
       	FD_SET(sockfd,&allset);
       /*设置select()有关参数 */

	while(true)
       	{
             	rect=allset;
             	nready=select(maxfd+1,&rset,NULL,NULL,NULL);
            /*选择,nready记录可选的文件个数 */
             	if(FD_ISSET(sockfd,&rset)){
			sin_size=sizeof(struct sockaddr_in);
                    	con_fd=accept(sockfd,(SA *)&their_addr,&sin_size);
                    	if(con_fd<0){
                         	printf("error in accept");
                         	exit(1);
                    	}
           /*创建新的连接 */
            		for(i=0;i<MAXSELECT;i++){
                  		if(client[i]<0)
                  		{
                       			client[i]=con_fd;
                       			break;
                   		}
                   		if(i==MAXSELECT){
                         		printf("too manyclients");
                         		continue;
                    		}
                    		FD_SET(con_fd,&allset);
                    		if(con_fd>maxfd)
                            		maxfd= ;
                    		if(i>maxi)
                            		maxi=i;
                   /*更新select()有关参数 */
                    		if(--nready<=0)
                             		continue;
                    /*如果没有描述字未处理,进入下一个循环 */
               		}
              /*处理监听套接口 */
               		for(i=0;i<maxi;i++){
                     		if((sock=client[i]<0)
                             		continue;
                 /*如果套接口不存在,处理下一个套接口 */
                     		if(FD_ISSET(sock,&^rset)){
                             		if(recv(sockfd,recvs,MAXSIZE,0)==0){
                                    		close(sock);
                                    	FD_CLR(sock,&allset);
                                    	client[i]=-1;
                              	}
                              	else
                          /*数据处理 */
                      	}
                     /*处理一个连接套接口 */
                      	if(--nready<=0)
                                break;
                      /*如果没有描述字未处理,进入下一个循环 */
               	}       

           /*处理各个连接套接口 */
        }
        close(sockfd);
        exit(0);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -