基于TCP的Linux通讯

上传人:豆浆 文档编号:2312566 上传时间:2017-07-22 格式:DOC 页数:13 大小:57KB
返回 下载 相关 举报
基于TCP的Linux通讯_第1页
第1页 / 共13页
基于TCP的Linux通讯_第2页
第2页 / 共13页
基于TCP的Linux通讯_第3页
第3页 / 共13页
基于TCP的Linux通讯_第4页
第4页 / 共13页
基于TCP的Linux通讯_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《基于TCP的Linux通讯》由会员分享,可在线阅读,更多相关《基于TCP的Linux通讯(13页珍藏版)》请在金锄头文库上搜索。

1、 基于 TCP 的 Linux 通讯学院:电子信息与电气工程学院班级:13 级网络工程一班学号:20131070131姓名:颜串怀1、需求分析现创建两个通讯端,服务器端和客户机端,实现基于 TCP 的端到端的 socket 通讯。当收到客户机的链接请求是,建立通讯会话,客户机发送消息,服务器把消息回显在终端上。二、建立流程服务器端的步骤如下:1. socket: 建立一个 socket2. bind: 将这个 socket 绑定在某个文件上(AF_UNIX)或某个端口上(AF_INET), 会分别介绍这两种。3. listen: 开始监听4. accept: 如果监听到客户端连接,则调用 ac

2、cept 接收这个连接并同时新建一个socket 来和客户进行通信5. read/write:读取或发送数据到客户端6. close: 通信完成后关闭 socket客户端的步骤如下:1. socket: 建立一个 socket2. connect: 主动连接服务器端的某个文件(AF_UNIX)或某个端口(AF_INET )3. read/write:如果服务器同意连接( accept),则读取或发送数据到服务器端4. close: 通信完成后关闭 socket三、相关函数简介1.int socket(int domain, int type, int protocol)domain:指定 so

3、cket 所属的域,常用的是 AF_UNIX 或 AF_INETAF_UNIX 表示以文件方式创建 socket,AF_INET 表示以端口方式创建 sockettype:指定 socket 的类型,可以是 SOCK_STREAM 或 SOCK_DGRAMSOCK_STREAM 表示创建一个 TCP 链接,有序的,可靠的,面向连接的socketSOCK_DGRAM 表示创建一个 UDP,不可靠的,无连接的 socketprotocol:指定 socket 的协议类型,一般指定为 0 表示由第一第二两个参数自动选择。socket()函数返回新创建的 socket,出错则返回-12.地址格式:常用

4、的有两种 socket 域:AF_UNIX 或 AF_INET,因此就有两种地址格式:sockaddr_un 和 sockaddr_in,分别定义如下:struct sockaddr_un sa_family_t sun_family; /* AF_UNIX */ char sun_path; /* pathname */ struct sockaddr_in short int sin_family; /* AF_INET */ unsigned short int sin_port; /* port number */ struct in_addr sin_addr; /* interne

5、t address */ 其中 in_addr 正是用来描述一个 ip 地址的:struct in_addr unsigned long int s_addr; sun_path 存放 socket 的本地文件名,sin_addr 存放 socket 的 ip 地址,sin_port 存放socket 的端口号。3.创建完一个 socket 后, 需要使用 bind 将其绑定:int bind(int socket, const struct sockaddr * address, size_t address_len)如果 使用 AF_UNIX 来创建 socket,相应的地址格式是 soc

6、kaddr_un,而如果 使用AF_INET 来创建 socket,相应的地址格式是 sockaddr_in,因此 需要将其强制转换为sockaddr 这一通用的地址格式类型,而 sockaddr_un 中的 sun_family 和 sockaddr_in中的 sin_family 分别说明了它的地址格式类型,因此 bind()函数就知道它的真实的地址格式。第三个参数 address_len 则指明了真实的地址格式的长度。bind()函数正确返回 0,出错返回-14.接下来 需要开始监听了:int listen(int socket, int backlog)backlog:等待连接的最大个

7、数,如果超过了这个数值,则后续的请求连接将被拒绝listen()函数正确返回 0,出错返回-15.接受连接:int accept(int socket, struct sockaddr * address, size_t * address_len)同样,第二个参数也是一个通用地址格式类型,这意味着 需要进行强制类型转化这里需要注意的是,address 是一个传出参数,它保存着接受连接的客户端的地址,如果 不需要,将 address 置为 NULL 即可。address_len: 期望的地址结构的长度,注意,这是一个传入和传出参数,传入时指定 期望的地址结构的长度,如果多于这个值,则会被截断,

8、而当 accept()函数返回时,address_len 会被设置为客户端连接的地址结构的实际长度。另外如果没有客户端连接时,accept()函数会阻塞accept()函数成功时返回新创建的 socket 描述符,出错时返回 -16.客户端通过 connect()函数与服务器连接:int connect(int socket, const struct sockaddr * address, size_t address_len)对于第二个参数, 同样需要强制类型转换address_len 指明了地址结构的长度connect()函数成功时返回 0,出错时返回-17.双方都建立连接后,就可以使用

9、常规的 read/write 函数来传递数据了8.通信完成后,需要关闭 socket:int close(int fd)close 是一个通用函数(和 read,write 一样),不仅可以关闭文件描述符,还可以关闭 socket 描述符四、AF_UNIX 和 AF_INET 区别主要的不同就是头文件去掉了,加入了和由于选择了 AF_INET,因此需要使用 sockaddr_in 地址结构体,其中的 sin_addr 存放ip 地址,sin_port 存放端口号。需要通过 inet_addr()函数将 ip 地址字符串转换成内部的表示形式。另外由于 intel 机器使用 little-endi

10、an 顺序,和网络数据的 big-endian 顺序不一致,因此 需要使用 htons()函数进行转换(因为端口是 16 位,因此使用 short)unsigned long int htonl(unsigned long int hostlong)unsigned short int htons(unsigned short int hostshort)unsigned long int ntohl(unsigned long int netlong)unsigned short int ntohs(unsigned short int netshort)htonl,host to net,

11、 longhtons,host to net, shortntohl,net to host, longntohs,net to host, short五、编程代码/*socket tcp 服务器端 */#include #include #include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 6666int main()int serverSocket;struct sockaddr_in server_addr;struct s

12、ockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer200;int iDataNum;if(serverSocket = socket(AF_INET, SOCK_STREAM, 0) #include #include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 6666int main()int clientSocket;struc

13、t sockaddr_in serverAddr;char sendbuf200;char recvbuf200;int iDataNum;if(clientSocket = socket(AF_INET, SOCK_STREAM, 0) );scanf(%s, sendbuf);printf(n);send(clientSocket, sendbuf, strlen(sendbuf), 0);if(strcmp(sendbuf, quit) = 0)break;iDataNum = recv(clientSocket, recvbuf, 200, 0);recvbufiDataNum = 0

14、;printf(recv data of my world is: %sn, recvbuf);close(clientSocket);return 0;6、参考文献UNIX 环境高级编程 美 W.理查德史蒂文斯( W.Richard Stevens) 著UNIX 网络编程 美 W.理查德史蒂文斯( W.Richard Stevens) 著TCP/IP 详解 美 赖特(Wright) 等 著6、不足之处1.本代码只有单个 C/S 的模式,只能单向通信,不能双向通信。2.没有图形界面,只有简单的命令行界面.3.地址分配的是测试用的回环地址,不符合真 实的通讯环境。七、总体评分评分人 得分 签字颜串怀(本人) 85 颜串怀罗维念 80 罗维念黄晨辉 85 黄晨辉郑东亮 83 郑东亮

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号