问题

● 试题四

请阅读以下说明和Socfort程序,将应填(n)处的字句写在答题纸的对应栏内。

【说明】

网络应用的基本模型是客户机/服务器模型,这是一个不对称的编程模型,通信的双方扮演不同的角色:客户机和服务器。

以下是一个简单的客户机程序(服务器程序略),其工作过程非常简单:客户机与服务器建立连接后,接收服务器向客户机返回的一条消息。

程序中用到了两种结构hostent与sockaddr_in:

hostent类型的结构定义如下:

struct hostent { char*h_name;//主机的正式名称

char**h_aliases;//别名列表

int h_addrtype;//主机地址类型:AF-XXX

int H_length;//主机地址长度:4 B(32 b)

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{

_u32 s-addr;//类型为unsignel-long

}

程序中使用到了多个函数:

struct hostent * gethostbyname(const char* hostname);

函数gethostbyname查询与指定的域名地址对应的IP地址,返回一个hostent结构的指针,如果不成功则返回NULL。

int_socket(int domain,im-type,int protoco1);

函数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*bur,int len);

int write(int fd,char*buf,int len);

函数read和write从套接字读和写数据,成功返回数据量大小,否则返回-1。buf指定数据缓冲区,len指定接收或发送的数据量大小。

【Socket程序】

//程序中引用的头文件略

#definePORT 3490

//定义端口号为3490

int main(int argc,char*argv[])

{int sockfd,nbytes;//套接字描述符、读入缓冲区的字节数

char buf[1024];//缓冲区

struct hostent*he;//主机信息类型

struct (1) srvaddr;//Internet套接字结构

if(argc!=2)

{perror("调用参数为零,请输入服务器的主机名!\n");exit (1) ;}

if( (2) )//如果通过主机名没有获得对应的主机信息就提示用户

{perror("无法通过主机名获得主机信息!\n");exit (1) ;}

if( (3) ) //在无法创建套接字时,提示用户

{perror("无法创建套按字!\n");exit (1) ;}

bzero(&srvaddr, (4) );//置空srvaddr

sraddr,sin_family=AF_INET;

srvaddr,sin_port: htons(PORT);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);

//打印数据并关闭套接字

}

参考答案
您可能感兴趣的试题
  • ● 试题五某单位有一个100台机器的大机房,要实现每一台计算机都上网,一般认为,用代理是一个办法,但是工作量比较大,要为每一台机器分别安装客户端软件,而且还要设置IP地址、网关、DNS服务器等。此外,
  • ●输入输出系统主要用三种方式与主机交换数据,对于这三种方式的描述正确的是 (1) 。(1) A.程序控制方式最节省CPU时间B.中断方式最耗费CPU时间C.DMA方式在传输过程中需要CPU的查询D.中
  • ●在计算机指令系统中,通常采用多种确定操作数的方式。当操作数直接给出时,这种寻址方式叫作 (2) ;当操作数的地址由某个指定的变址寄存器的内容与位移量相加得到时,叫作 (3) ;如果操作数的地址是主存
  • ●存储器地址有很重要的作用,它的作用是 (5) 。(5) A.便于按照地址编号读写连续的数据B.作为存储器中不同数据字的惟一标志C.便于程序连续存放D.作为区分地址中的数据和指令的标志
  • ●避免死锁的一个著名的算法是 (6) 。(6) A.先入先出法B.银行家算法C.优先级算法D.资源按序分配法
  • ●项目管理工具中,将网络方法用于工作计划安排的评审和检查的是 (7) 。(7) A.Gantt图B.PERT网图C.因果分析图D.流程图
相关内容