请阅读以下说明和Socfon程序,将应填(n)处的字句写在对应栏内。 【说明】 网络应用的基本模型是客户机/服务器模型,这是一个不对称的编程模型,通信的双方扮演不同的角色:客户机和服务器。 以下是一个简单的客户机程序(服务器程序略),其工

admin2009-02-15  53

问题 请阅读以下说明和Socfon程序,将应填(n)处的字句写在对应栏内。
   【说明】
   网络应用的基本模型是客户机/服务器模型,这是一个不对称的编程模型,通信的双方扮演不同的角色:客户机和服务器。
   以下是一个简单的客户机程序(服务器程序略),其工作过程非常简单:客户机与服务器建立连接后,接收服务器向客户机返回的一条消息。
   程序中用到了两种结构hostent与sockaddr - in:
   hostent类型的结构定义如下:
      struct hostent {char*h_name;   //主机的正式名称
                         char * * h_aliases;     //别名列表
                         int h_addrtype;  //主机地址类型:AF_XXX
                         Int H_length;    //主机地址长度:4B(32b)
                         char * * h_addr_list;//主机IP地址列表}
      #define h_addr h_addr_list [0]
   sockaddr_in类型的结构定义:sockaddr_in是通用套接字结构sockaddr在TCP/IP协议下的结构重定义,为TCP/IP套接字地址结构。
       Struct sockaddrin{
           short int sin_family;//地址类型AF_XXX,其中AF_INET为TCP/IP专用
           unsigned short int sin_port;    //端口号
           struct in_addr sin_addr;        //Internet地址
        //端口号以及Internet地址使用的是网络字节顺序,需要通过函数htons转换
        }
        struct iN_addr{
           _u32s_addr;     //类型为unsignel_long
        }
   程序中使用到了多个函数:
        struct hostent * gethostbyname(const char*hostname);
   函数gethostbyname查询与指定的域名地址对应的IP地址,返回一个hostent结构的指针,如果不成功则返回NULL。
       int_socket(int domain,int_type,int protocol);
   函数socket创建一个套接字描述符,如果失败返回-1。domain为地址类型,type为套接字类型,本题中为SOCK_STRBEAM;protocol指定协议,本题中为0。
       int connect(int sockfd,struct sockaddr*servaddr,int addrlen);
   函数connect与服务器建立一个连接,成功返回0,失败返回-1。servaddr为远程服务器的套接字地址,包括服务器的IP地址和端口号;addrlen为地址的长度。
       int read(int fd,char * buf,int len);
       int write(int fd,char * buf,int len);
   函数read和write从套接字读和写数据,成功返回数据量大小,否则返回-1。buf指定数据缓冲区,len指定接收或发送的数据量大小。
   【Socket程序】
       //程序中引用的头文件略
       #define PORT 3490
       //定义端口号为3490
       int main(int argc,char*argv[])
       { int sockfd,nbytes; //套接字描述符、读入缓冲区的字节数
         char buf [1024];      //缓冲区
         struct hostent * he; //主机信息类型
         struct sockaddr_in srvaddr;  //Internet套接字结构
             if(  (1)  )
                 { perror(“调用参数为零,请输入服务器的主机名!\n”);  exit(1);}
             if(  (2)  )    //如果通过主机名没有获得对应的主机信息就提示用户
                 { perror(“无法通过主机名获得主机信息!\n”);  exit(1);}
             if(  (3)  )   //在无法创建套接字时,提示用户
                 { perror(“无法创建套按字!\n”);  exit(1);}
             bzero(&srvaddr,sizeof(srvaddr));  //置空srvaddr
             srvaddr, sin_family=AF_INET;
             srvaddr, sin_port:  (4)  ;srvaddr.sin_addr:  (5)  ;
             //设置套接字结构的各项信息,其中的地址来自域名查询后的hp变量
             if(connect(sockfd,  (n)  ,sizeof(struct sockaddr))==-1)
                  { perror(“连接失败!\n”);  exit(1);}
             //连接服务器,如果失败则提示用户
              if((nbytes=read(sockfd,buf,MAXDATASIZE))==-1)
                { perror(“读失败!\n”);exit(1);}
             //从套容接字中读出数据
             buf [nbytes]=’\0’;
             printf(“读到的内容:%s”,buf);
             close(sockfd);
             //打印数据并关闭套接字
   }

选项

答案(1) argc! =2 (2) (he=gethostbyname(argv[1]))==NULL (3) (sockfd=socket(AF_INET, SOCK_STREAM.0))==-1 (4) htons(PORT) (5) *((struct in_addr * )he->h_addr) (6) (struct sockaddr * ) &srvaddr

解析
转载请注明原文地址:https://kaotiyun.com/show/exPZ777K
0

最新回复(0)