基于TCP的Linux通讯.doc_第1页
基于TCP的Linux通讯.doc_第2页
基于TCP的Linux通讯.doc_第3页
基于TCP的Linux通讯.doc_第4页
基于TCP的Linux通讯.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于TCP的Linux通讯学院:电子信息与电气工程学院 班级:13级网络工程一班学号:20131070131姓名:颜串怀1、 需求分析现创建两个通讯端,服务器端和客户机端,实现基于TCP的端到端的socket通讯。当收到客户机的链接请求是,建立通讯会话,客户机发送消息,服务器把消息回显在终端上。二、建立流程服务器端的步骤如下:1. socket: 建立一个socket2. bind: 将这个socket绑定在某个文件上(AF_UNIX)或某个端口上(AF_INET), 会分别介绍这两种。3. listen: 开始监听4. accept: 如果监听到客户端连接,则调用accept接收这个连接并同时新建一个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:指定socket所属的域,常用的是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.地址格式:常用的有两种socket域:AF_UNIX或AF_INET,因此就有两种地址格式:sockaddr_un和sockaddr_in,分别定义如下:structsockaddr_unsa_family_tsun_family;/*AF_UNIX*/ charsun_path;/*pathname*/ structsockaddr_inshortintsin_family;/*AF_INET*/unsignedshortintsin_port;/*portnumber*/structin_addrsin_addr;/*internetaddress*/其中in_addr正是用来描述一个ip地址的:structin_addrunsignedlongints_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,相应的地址格式是sockaddr_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:等待连接的最大个数,如果超过了这个数值,则后续的请求连接将被拒绝listen()函数正确返回0,出错返回-15.接受连接:int accept(int socket, struct sockaddr * address, size_t * address_len)同样,第二个参数也是一个通用地址格式类型,这意味着 需要进行强制类型转化这里需要注意的是,address是一个传出参数,它保存着接受连接的客户端的地址,如果 不需要,将address置为NULL即可。address_len: 期望的地址结构的长度,注意,这是一个传入和传出参数,传入时指定 期望的地址结构的长度,如果多于这个值,则会被截断,而当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.双方都建立连接后,就可以使用常规的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-endian顺序,和网络数据的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, 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 sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer200;int iDataNum;if(serverSocket = socket(AF_INET, SOCK_STREAM, 0) 0)perror(socket);return 1;bzero(&server_addr, sizeof(server_addr);server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr) 0)perror(connect);return 1;if(listen(serverSocket, 5) 0) perror(listen);return 1;while(1)printf(Listening on port: %dn, SERVER_PORT);client = accept(serverSocket, (struct sockaddr*)&clientAddr, (socklen_t*)&addr_len);if(client 0)perror(accept);continue;printf(nrecv client data.n);printf(IP is %sn, inet_ntoa(clientAddr.sin_addr);printf(Port is %dn, htons(clientAddr.sin_port);while(1)iDataNum = recv(client, buffer, 1024, 0);if(iDataNum 0)perror(recv);continue;bufferiDataNum = 0;if(strcmp(buffer, quit) = 0)break;printf(%drecv data is %sn, iDataNum, buffer);send(client, buffer, iDataNum, 0);return 0;/*socket tcp客户端*/#include #include #include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 6666int main()int clientSocket;struct sockaddr_in serverAddr;char sendbuf200;char recvbuf200;int iDataNum;if(clientSocket = socket(AF_INET, SOCK_STREAM, 0) 0)perror(socket);return 1;serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(SERVER_PORT);serverAddr.sin_addr.s_addr = inet_addr();if(connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr) );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;printf(recv data of my world is: %sn, recvbuf);close(clientSocket);r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论