TCP协议网络编程实现两台计算机通信(详细注释)_第1页
TCP协议网络编程实现两台计算机通信(详细注释)_第2页
TCP协议网络编程实现两台计算机通信(详细注释)_第3页
全文预览已结束

下载本文档

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

文档简介

1、3CTCP(必做题)TCP/IPsocket是面向连接的TCP 是面向连接的所以只能用于点对点的通讯。对比一下,UDPUDP程序采用服务器/客户机模式,下面是服务器的程序设计方案【1】 首先利用 socket 系统调用获得一个套接口【2】 系统调用 bind 将这个套接口绑定到主机的某个端口上【3】 端口开始侦听有无连接请求,系统调用 listen【4】 没有就继续侦听,有的话执行下一步【5connectaccept(述符,这个时候通信管道已经完全建立好了【6】 利用这个新的描述符完成发送数据帧的操作,系统调用 send()【7】 发送完毕要撤销套接口下面是完整程序和详细注释清 单 01 se

2、rver.c #include #include #include #include #include #include #include#include头文件#define MYPORT3490定义用于通信的端口号#define BACKLOG 10定义等待队列中最多存放的connect请求个main()主函数这里开始int sockfd,new_fd;socket()系统调用得到的文件描述符struct sockaddr_in my_addr; 结构体定义,这是自己和对方的套接口的地址信息struct sockaddr_in their_addr;int sin_size;if(sockf

3、d=socket(AF_INET,SOCK_STREAM,0)=-1)perror(socket);进入正题,首先系统调用,sockfd就是exit(1);所得套接口的文件描述符,如果调用失败,perror 显示错误信息,然后非正常退出my_addr.sin_family=AF_INET; /ADDRESS FAMILY地址族my_addr.sin_port=htons(MYPORT);/ MYPORT转换成“网络字节顺序” my_addr.sin_addr.s_addr=INADDR_ANY;/IP 地址, IP地址bzero(&(my_addr.sin_zero),8);/结构体中剩下的清

4、 0上面是第一步,调用socket()得到了一个套接口,下面将调用bind()将其绑定到本地计算机的某个端口上,当然这里就是前面定义的那个端口if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)=-1)perror(bind);如果失败就显示bind()调用出错原因,成功的exit(1);就继续往下运行TCP/IP 协议进行数据流的传输就像两个地方搭个管道输送水流一样, 那你就需要等待接入请求并且用各种方法处理它们。处 理过程分两步:首先, 你听-listen(),然后,你接受-accept() (。if (lis

5、ten(sockfd,BACKLOG)=-1)/BACKLOG 是在进入 队列中允许的连接数目,进入的连接是在队列中一直等待直 到接受 (accept() )连接perror(listen); 在错误的时候返回-1exit(1);下面就是接受一个连接请求了while(1)sin_size=sizeof(struct sockaddr_in);if(new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size)=-1)perror(accept); 注意这里出现了第二个文件描述符,如果只想让一个连接close() sockfd 口更多

6、的连接continue; acceptprintf(server:got connection from %sn,inet_ntoa(their_addr.sin_addr);连接上了要输出一个反馈信息:server:got connection from+客户端的 ip 地址sen(么被包装的,这些交给下层处理,fork()产生一个子进程用来发送数据if(!fork()if (send (new_fd,hello,world!n,14,0)=-1) perror(send);close(new_fd); exit(0);close(new_fd);发送完毕即时的关掉套接口while(wait

7、pid(-1,NULL,WNOHANG)0);最后释放子进程的资源,防止产生僵尸进程造成资源没有释放。至此服务器程序设计完毕,下面着手客户机的程序设计,与服务器相比客户端的设计相对简单一些,其程序设计流程大致如下【1】 系统调用 socket()获得套接口【2】 由于我是要连到远方服务器端口,所以我不必绑定到自己的机器端口上, 故而有了套接口下面可以直接向远方主机发送 connect 连接请求【3】 如果 connect 失败,那就返回第二步,继续 connect,直到成功【4】 连接成功后通信管道就建好了,可以调用 recv()来接受数据帧【5】 最后把套接口释放掉下面是完整程序和详细注释清

8、 单 02 user.c #include #include #include #include #include #include #include#include头文件#define PORT3490/ 端口号定义,这就是将要连接到的端口#define 100这个参数是一次所能得到的最大字节数下面开始主函数,注意main 函数是有参数的,argc=参数的个数+1,因为函数自身算一个参数,数组 argv用来依次存放指向参数的指针int main(int argc,char *argv)前面都是对一些参数类型进行声明int sockfd,numbytes;char bufMAXDATASIZE

9、; struct hostent *he;struct sockaddr_in their_addr;main 1 if(argc != 2)fprintf(stderr,usage:client hostnamen); 如果参数不是一个就报错exit(1);然后非正常退出(ip 地址,参数的指针就在argv1里面ip 地址。if(he=gethostbyname(argv1)=NULL)herror(gethostbyname); 出错的话返回出错信息exit(1);能运行到这一步说明参数个数和参数内容都是正确的,其实这才是真正的开始调用 socket()得到套接口,sockfd 为返回的套

10、接口描述符if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(socket); exit(1);下面的跟之前服务器端程序差不多,是对套接口信息初始化their_addr.sin_family=AF_INET; their_addr.sin_port=htons(PORT);their_addr.sin_addr=*(struct in_addr *)he-h_addr); bzero(&(their_addr.sin_zero), 8);可以继续用我的那个比喻,如果服务器是水库,并且那里已经有个出口在侦听是if(connect(sockfd,(s

11、truct sockaddr *)&their_addr,sizeof(struct sockaddr)=-1)perror(connect); exit(1);connect,并且accept send recv() if(numbytes=recv(sockfd,buf,MAXDATASIZE,0)=-1)perror(recv); exit(1);bufnumbytes=0;把收到的信息显示出来吧printf(received:%s,buf);最后关闭套接口,释放端口close(sockfd); return 0;linux 在我的电脑上同时开两个窗口,分别模拟服务器和用户,键入Ifconfig ip 地址,本地环回 inet 地址 127.0.0.1运行 ./server服务器开始运然后 ./user 127.0.0.1 用户程序运行运行结果:服务器端显示 server:got

温馨提示

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

评论

0/150

提交评论