实验 6. Linux Socket 实验
1、实验目的: (1) 了解 TCP/IP 协议;(2) 掌握 socket 程。2、实验设备:
(1) PC 机的 VMware 虚机运行 Ubuntu Linux 系;(2) 两机对连的网络线;(3) 网口的测试计算机;(4) WINDOWS“SOCKET TOOL”调试工具。3、实验内容:实现典型客机/服器程序中的服器及客机。4、实验原理4.1 客机/服器工作流程使用TCP协议的客机/服程的工作程如下4.2 Socket 程相关函数常用的socket函数有:socket,bind,listen,accept,connect,send,recv。1)socket(建立接)表文件:#include<sys/types.h>#include<sys/socket.h>定函数:int socket(int family,int type,int protocol);函数明:socket()函数用来生成一个套接口描述字,也称套接字,指定协议簇和套接口。参数:family指定协议族,type指明字流方式,而protocol一般0Family的取:AF_LOCALUNIX协议族AF_ROUTE路由套接口AF_INETIPv4协议AF_INET6IPv6协议AF_KEY密套接口参数type的取:SOCK_STREAMTCP套接口SOCK_DGRAMUDP套接口SOCK_PACKET支持数据访问SOCK_RAM原始套接口返回:成功返回非描述字,失返回负值2)bind(socket定位)表文件:#include<sys/types.h>#include<sys/socket.
h>定函数:Int bind(int sockfd,struct sockaddr * my_addr,int addrlen);函数明bind()用来socket编程聊天室基本流程置参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr构,于不同的socketdomain定了一个通用的数据构structsockaddr{unsignedshortintsa_family;charsa_data[14];};sa_family为调用socket()的domain参数,即AF_xxxx。sa_data最多使用14个字符度。此sockaddr构会因使用不同的socketdomain而有不同构定,例如使用AF_INETdomain,其socketaddr构定便structsocketaddr_in{unsignedshortintsin_family;uint16_tsin_port;structin_addrsin_addr;unsignedcharsin_zero[8];};structin_addr{uint32_ts_addr;};sin_family即sa_familysin_port使用的port号sin_addr.s_addrIP地址sin_zero未使用。参数socket套接字,my_addr是一个指向特定协议地址构的指,addrlensockaddr的度。返回成功返回0,失返回-1,错误原因存于errno中。错误EBADF参数sockfd非合法socket理代。EACCESS权限不足ENOTSOCK参数sockfd一文件描述,非socket。3)listen(等待接)表文件:#include<sys/socket.h>定函数:Int listen(ints,intbacklog);函数明:listen()用来等待参数s的socket连线。参数backlog指定同理的最大接要求,如果接数目达此上限client端将收到ECONNREFUSED的
。Listen()并未开始接收连线,只是置socketlisten模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后用,接着才用accept()。返回成功返回0,失返回-1,错误原因存于errno附加明listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果socketAF_INET参数backlog最大至128。错误EBADF参数sockfd非合法socket理代EACCESS权限不足EOPNOTSUPP指定的socket并未支援listen模式。4)accept表文件:#include<sys/types.h>#include<sys/socket.h>定函数:Int accept(int s,struct sockaddr * addr,int * addrlen);函数明accept()用来接受参数s的socket连线。参数s的socket必需先bind()、listen()函数,当有连线进accept()会返回一个新的socket理代,往后的数据送与取就是由新的socket理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功,参数addr所指的构会被系填入程主机的地址数据,参数addrlenscokaddr的度。关于构sockaddr的定义请参考bind()。返回成功返回新的socket理代,失返回-1,错误原因存于errno中。错误EBADF参数s非合法socket理代。EFAULT参数addr指指向无法存取的内存空。ENOTSOCK参数s一文件描述,非socket。EOPNOTSUPP指定的socket并非SOCK_STREAM。EPERM防火
连线。ENOBUFS系冲内存不足。ENOMEM核心内存不足。5)connect(建立socket连线)表文件:#include<sys/types.h>#include<sys/socket.h>定函数:Int connect(int sockfd,struct sockaddr * serv_addr,int addrlen);函数明connect()用来将参数sockfd的socket至参数serv_addr指定的网地址。构sockaddr参考bind()。参数addrlensockaddr的度。返回成功返回0,失返回-1,错误原因存于errno中。错误EBADF参数sockfd非合法socket理代EFAULT参数serv_addr指指向无法存取的内存空ENOTSOCK参数sockfd一文件描述,非socket。EISCONN参数sockfd的socket已是连线ECONNREFUSED连线要求被server端拒。ETIMEDOUT企图连线的操作超限定时间仍未有响。ENETUNREACH无法送数据包至指定的主机。EAFNOSUPPORTsockaddr构的sa_family不正确。EALREADYsocket不可阻断且先前的连线操作未完成。6)send()和recv()两个函数用于面向接的socket上行数据传输。函数定:Int send(int sockfd,const void * msg,int len,int flags);参数:Sockfd是你想用来传输数据的socket描述符;msg是一个指向要送数据的指;Len是以字节为单位的数据的度;flags一般情况下置0(关于参数的用法可参照man手册)。返回:send()函数返回实际送出的字数,可能会少于你希望送的数据。在程序中应该将send()的返回与欲
送的字行比。当send()返回与len不匹配,应该对这种情况理。char*msg="Hello!";intlen,bytes_sent;......len=strlen(msg);bytes_sent=send(sockfd,msg,len,0);......函数定:int recv(int sockfd,void * buf,int len,unsigned int flags);参数:sockfd是接受数据的socket描述符;buf是存放接收数据的冲区;len是冲的度。Flags也被置0。返回:Recv()返回实际上接收的字数,当出现错误时,返回-1并置相的errno。sendto()和recvfrom()用于在无接的数据socket方式下行数据传输。由于本地socket并没有与端机器建立接,所以在送数据时应指明目的地址。5、编译及运行(1) 接 PC 机和中央网关板的串口线;(2) 打开 PC 机的超级终端,置“115200,8,n,1”;(3) 接 PC 机和中央网关板的网络线;(4) 置 PC 机 IP 地址到”192.168.0.200”;(5) 中央网关板加;(6) 使用 arm-linux-gcc 编译文件 socketclient.c socketclient;(7) 将 socketclient 使用 FTP 下到中央网关板,修改运行权限 chmod +xsocketclient;(8) 运行 Windows 下 sockettool 调试工具,建立 TCP Server,端口 1002;(9) 运行编译后的程序:./socketclient “192.168.0.200” 1002;6、实验现象Socketclient 将接到 server,入的数据将在 server 端示出来。7、附7.1 算机网体系构模式所有的网通信方式分两种:线路交和包交。所线路交,就是指再传输时送端和接收端之建立一个特定的线接,数据就可以在线路上
传输电话是采用的种方式。算机网络则采用的是包交,数据的送端将要传输的数据分割成,而每个块经过适当的理后形成一个数据包,包中有接收端的地址等必要信息,每个包传输。包中的数据并不是限定死的,只要保数据的正确传输即可,具体应该哪些信息,与使用的协议有关。(1) OSI 准OSI准是开放系联标准(OpenSystermInterconnection)即我通常所的网的七框架,他是1977年国际标准化组织提出的一种参考模型。得注意的是,OSI并没有提供一个可以实现的方法,它不是一个准而只是一个制定使用的概念性的框架,更不是一个网络协议。1)、物理(PhysicalLayer):主要功能了网的物理构,传输准,Bit流的编码及网时间,如分复用及分复用。决定了网络连接类型(端到端或多端接)及物理拓扑构。的通俗一些,主要负责实际的信号传输。2)、(DataLinkReview):在两个主机上建立数据接,向物理层传输数据信号,并信号理使之无差并合理的传输。3)、网络层(NetworkLayer):主要负责路由,选择合适的路径,行阻塞控制等功能。4)、传输层(TransferLayer):最关的一,向拥护提供可靠的端到端(End-to-End)服,它屏蔽了下的数据通信细节,用程序不需要考虑实际的通信方法。5)、会话层(SessionLayer):主要负责两个会话进程之的通信,即两个会话层实体之的信息交,管理
数据的交。6)、表示(PresentationLayer):理通信信号的表示方法,行不同的格式之的翻,并负责数据的加密解密,数据的压缩与恢复。7)、(ApplicationLayer):保持用程序之建立接所需要的数据记录,。在工作中,每一上一层传输来的数据加上一个信息(header),然后向下层发出,然后通物理介质传输方主机,方主机每一数据理,把信息取掉,最后原成实际的数据。本上,主机的通信是的通信,而在物理上是从上向下最后通物理信道到方主机再从下向上传输。TCP/IP协议实际应用中,最重要的是TCP/IP(TransportControlProtocol/InternetProtocol)协议,它是目前最流行的商化的协议,相于OSI,它是当前的工业标准或“事准”,在1974年由Kahn提出的。它分四个次(从高到低):(与OSI的层对应),传输层(与OSI的传输层对应),互联层(与OSI的网络层对应),主机-网络层(与OSI的数据和物理层对应)。7.2 客机与服器TCP/IP允程序在两个用程序之建立通信并来回传递数据,提供一种等通信,用程序可以在同一台机器上,也可以在不同的机器上运行。尽管TCP/IP指明了数据是如何在一正在通信的用程序间传递的,但是他并没有等的用程序在什么时间进行交互以及什么要行交互,也没有定程序在一个分布式境下应该如何组织这用程序。践中,有一种组织的方法在使用TCP/IP中占据着主
要地位,在网上的大多数的通信用程序都使用种机制。客机/服器模式要求每个用程序有两部分成:一个部分负责通信,另一个部分负责对答。他通常运行在不同的主机上,分别被称机和服器。服器是指能在网上可提供服的任何程序;客机是指用户为了得到某种服所需要运行的用程序。一个服器接受网上客机的求,完成服后将果返回机。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。