Linux Socket 编程实验

  • 格式:docx
  • 大小:24.88 KB
  • 文档页数:6

实验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()用来设置给参数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_addr为IP地址sin_zero未使用。

参数socket为套接字,my_addr是一个指向特定协议地址结构的指针, addrlen为sockaddr的结构长度。

返回值成功则返回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()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。

通常listen()会在socket(),bind()之后调用,接着才调用accept()。

返回值成功则返回0,失败返回-1,错误原因存于errno附加说明listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。

如果socket为AF_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所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。

关于结构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()。

参数addrlen为sockaddr的结构长度。

返回值成功则返回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年国际标准化组织提出的一种参考模型。