资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,实验二 使用,socket,实现,C/S,程序,上一个实验已经知道了,C/S,的编写框架如下:,一、,基于,UDP,(面向无连接)的,socket,编程,服务器端(接收端)程序:,1.,加载套接字库,2.,创建套接字(,socket,),3.,将套接字绑定到一个本地地址和端口上(,bind,),4.,等待接收数据(,recvfrom,),5.,关闭套接字,(closesocket),客户端(发送端)程序,1.,加载套接字库,2.,创建套接字(,socket,),3.,向服务器发送数据(,sendto,),4.,关闭套接字,(closesocket),二、基于,TCP,(面向连接)的,Socket,编程,服务器端程序:,1.,加载套接字库,2.,创建套接字(,socket,),3.,将套接字绑定到一个本地地址和端口上(,bind,),4.,将套接字设为监听模式,准备接收客户请求(,listen,),5.,等待客户请求的到来;当请求带来后,接受连接请求,返回一个新的对应于此次连接的套接字(,accept,),6.,用返回的套接字和客户端进行通信(,send/recv,),7.,返回,等待另一个客户请求,8.,关闭套接字,(closesocket),客户端程序:,1.,加载套接字库,2.,创建套接字,(socket),3.,向服务器发送连接请求(,connect,),4.,和服务器端进行通信,(send/receive),5.,关闭套接字,(closesocket),因为,UDP,的程序较简单,,所以这次实验的目标是,实现一个服务器,端和,客户端交互聊天,的,程序,,下面列出一些会用到的函数,(一些上个实验中的函数就没有列出):,1,、,int bind(SOCKET s,const struct sockaddr FAR*name,int namelen),第一个参数指定要绑定的套接字,第二个参数指定该套接字的本地地址信息,是指向,sockaddr,结构的指针变量,由于该地址结构是为了所有的地址家族准备使用的,这个结构可能(通常会)随使用的网络协议不同而不同,所以,要用第三个参数指定该地址结构,的长度。,sockaddr,定义如下:,struct sockaddr,u_short sa_family;,char sa_data14;,第一个字段指定该地址家族,在这里必须设为,AF_INET,。,sa_data,仅仅是表示要求一块内存分配区,起到占位的作用,该区域中指定与协议相关的具体地址信息。由于实际要求的只是内存区,所以对于不同的协议家族,用不同的结构来替换,sockaddr,。在,TCP/IP,中,我们可以用,SOCKADDR_IN,结构来代替,sockaddr,,以方便我们填写地址信息。,2,、,int,listen(SOCKET s,int backlog,),将,套接字设置为监听模式,其中第二个参数设置等待请求连接的最大的值,即如果设置为,n,,则前,n,个请求会放置在系统的请求连接队列中,应用程序会依次对这些请求进行服务,但第,n+1,个连接请求则会被拒绝。,3,、,SOCKET,accept(SOCKET s,const struct sockaddr FAR*addr,int FAR*addrlen,),从客户端接收请求,并创建连接,如果连接成功,则会返回一个当前成功建立连接的套接字,该套接字不是上面创建的监听套接字,而是仅仅适用于当前的一个请求连接,如果建立连接失败,则返回值是,INVALID_SOCKET,,并且可以适用,WSAGetLastError(),函数得到相关的失败信息,具体的,error code,具体意义见,MSDN,中,accept,函数的最后部分的介绍,4,、,int send(SOCKET s,const char FAR*buf,int len,int flags),第一个参数指定发送端套接字描述符;,第二个参数指明一个存放应用程序要发送数据的缓冲区(想要发送的数据);,第三个参数指明实际要发送的数据的字节数;,第四个参数一般置,0,。,5,、,int recv(SOCKET s,char FAR*buf,int len,int flags,),第一个参数指定接收端套接字描述符;,第二个参数指明一个缓冲区,该缓冲区用来存放,recv,函数接收到的数据;,第三个参数指明,buf,的长度;,第四个参数一般置,0,。,6,、,int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR*name,int namelen),s,:标识一个未,连接套接字的,描述字。,name,:欲进行连接的端口名。,namelen,:名字,长度。若无错误发生,则,connect(),返回非,0,。否则的话,返回,SOCKET_ERROR,错误。,在,附件中给出了一个参考的程序代码,大家可以用来参考。,
展开阅读全文