TCP协议网络编程实现两台计算机通信(详细注释)
3.试用C语言编写一对在以太网中发送和接收数据帧的应用,建议采用Socket的TCP协议端口,必须提供软件设计方案和流程图,软件代码的每一行都必须加注中文注释说明设计意图,不得抄袭。(必做题)
解答: 编程使用TCP/IP协议,采用数据流的socket套接口,TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于点对点的通讯。对比一下,UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送,UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象。
程序采用服务器/客户机模式,下面是服务器的程序设计方案
首先利用socket系统调用获得一个套接口
系统调用bind将这个套接口绑定到主机的某个端口上
端口开始侦听有无连接请求,系统调用listen
没有就继续侦听,有的话执行下一步
接受connect的请求,系统调用accept(),得到一个新的套接口描述符,这个时候通信管道已经完全建立好了
利用这个新的描述符完成发送数据帧的操作,系统调用send()
发送完毕要撤销套接口
下面是完整程序和详细注释
清单01 server.c
#include
#include
#include
#include
#include
#include
#include
#include /头文件
#define MYPORT 3490 /定义用于通信的端口号
#define BACKLOG 10 /定义等待队列中最多存放的connect请求个数
main() /主函数这里开始
{int sockfd,new_fd; /这两个是调用socket()系统调用得到的文件描述符
struct sockaddr_in my_addr; /结构体定义,这是自己和对方的套接口的地址信息
struct sockaddr_in their_addr;
int sin_size; /其实这是accept()里面的第三个参数,这里先定义
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{perror("socket"); /进入正题,首先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);/结构体中剩下的清0
上面是第一步,调用socket()得到了一个套接口,下面将调用bind()将其绑定到本地计算机的某个端口上,当然这里就是前面定义的那个端口
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{perror("bind"); /如果失败就显示bind()调用出错原因,成功的话
exit(1); /就继续往下运行
}
其实利用TCP/IP协议进行数据流的传输就像两个地方搭个管道输送水流一样,现在这里是水电站,前面两步已经弄好了一个出水口,下面就要监听对方是否需要我送水过去,运行listen()系统调用。假如你不希望与远程的一个地址相连,那你就需要等待接入请求并且用各种方法处理它们。处?理过程分两步:首先,你听--listen(),然后,你接受--accept()?(请看下面的?内容)。
if (listen(sockfd,BACKLOG)==-1) /BACKLOG?是在进入?队列中允许的连接数目,进入的连接是在队列中一直等待直?到接受?(accept()?)连接
{p