请阅读以下说明和Socket程序,填入(n)处。 【说明】 以下是客户机/服务器模型中的一个简单的客户机程序(服务器程序略),其工作过程非常简单:客户机与服务器建立连接后,接收服务器向客户机返回的一条消息。 程序中用到了两种结构hoste

admin2009-05-15  32

问题 请阅读以下说明和Socket程序,填入(n)处。
   【说明】
   以下是客户机/服务器模型中的一个简单的客户机程序(服务器程序略),其工作过程非常简单:客户机与服务器建立连接后,接收服务器向客户机返回的一条消息。
   程序中用到了两种结构hostent与sockaddr_in:
   hostent类型的结构定义
   struct hostent { char*h_name;    //主机名称
   char**h_aliases;    //别名列表
   int h_addrtype;    //主机地址类型: AF_XXX
   int H_length;    //主机地址长度: 32位
   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_addrsin_addr;    //Internet地址
   //端口号以及Internet地址使用的是网络字节顺序,需要通过函数htons转换
   }
   struct iN_addr {
   _u32 s_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_STREAM; 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 PORT4490
   //定义端口号为4490
   int main( int argc, char*argv[ ])
   {
   int sockfd, nbytes;    //套接字描述符、读入缓冲区的字节数
   char buf[1024];    //缓冲区
   stmct 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);
   if(connect(sockfd, (6), sizeof( struct sockaddr))=-1)
   {perror("连接失败!\n");exit(1); }
   //连接服务器,如果失败则提示用户
   if(( nbytes=read ( sockfd, buf, MAXDATASIZE))=-1)
   {perror("读失败!\n");exit(1); }
   //从套容接字中读出数据
   buf[nbytes]=’\0’;
   prinff("读到的内容:%s", buf);
   close( sockfd);
   //打印数据并关闭套接字
   }

选项

答案(1)argc! =2 //判断参数个数是否为2;即判断是否输入主机名。 (2)(he=gethostbyname(argv[1]))=NULL //取得主机信息 (3)(sockfd=socket(AF_NET, SOCK_STREAM.0))=-1 //返回socket描述符 (4)htons(PORT) //对端口进行主机字节序向网路字节序的转换 (5)*((structin_addr*)he→h_addr) //设定主机地址 (6)(struct sockaddr*)&srvaddr //取服务器地址值的地址

解析
转载请注明原文地址:https://jikaoti.com/ti/M8n7FFFM
0

相关试题推荐
最新回复(0)