南京晓庄学院网络编程 实验5-1

南京晓庄学院网络编程  实验5-1
南京晓庄学院网络编程  实验5-1

实验五关于tcp套接字编程(1)

一、实验目的

1熟悉基本TCP套接字编程流程(服务器端、客户端)

2掌握流程中的关键函数的用法

二、实验要求

1 将实例程序完善、录入、编译、运行,记录运行结果

2 写出能体现TCP套接字编程流程的语句(服务器端、客户端分开写)

三、实例程序

服务器端

第一个值:1 BACKLOG = 未完成链接+已完成链接。不固定。因为BACKLOG参数规定了请求队列中的最大连接数,它对队列中等待服务请求的数目进行了限制所以在这里定义值为1即可。

第二个值:listenfd 是bind函数的第一个参数,bind函数的作用就是为调用socket()函数产生的套接字分配一个本地协议地址,建立地址套接字的对应关系。在第6行中,服务器端在调用socket函数,为其分配参数,AF_INET为套接字使用IPV4的协议。Sock_stream为字节流套接扣,TCP使用的是这种形式,在调用socket函数时,最后一个参数是协议标志,一般在调用socket时定义为0。如果socket函数调用成功的话会返回套接字描述符,即这里的listenfd 所以第二个值应该填写listenfd

第三个值:&server 是bind的第二个参数,表征身份信息,在绑定过程中,需要用到网际套接字地质结构类型,所以这里为&server,并将网际套接字类型强转成通用套接字地质结构。Server参数是指向特定于协议的地质结构的指针,指定用于通信的本地协议地址。

第四个值:sizeof(server) 是bind的第三个参数,代表结构体的长度,在这个结构体中结构体名为server,所以通过sizeof()函数,用于求出结构体的长度。

整句话作用:bind函数,将socket函数产生的套接字分配一个本地协议地址,建立地址与套接字的对应关系。如果调用成功返回0 出错返回-1,并且if语句后置错误号errno。

第五个值:listenfd 是listen()函数的第一个参数,套接字文件描述符,即通信端点,socket 的返回值,所以这里为listenfd

第六个值:BACKLOG 是listen()函数的第二个参数,BACKLOG规定了请求队列的最大连接数,BACKLOG=未完成链接+已完成链接。在第一个值已经定义,所以直接调用。

整句话作用:对于TCP服务器,在绑定操作后,必须要调用Listen()函数,将这个未连接的套接字转换成被动套接字,使它处在监听模式下,指示内核应接受发向该套接字的连接请求。

第七个值:client ,将某个变量的长度赋给addrlen,根据下文,在使用accept函数,可以知道,addrlen作为accept的第三个参数,addrlen是一个值-结果参数,调用前,将addrlen指针所指的整数值置为client所致的套接字地址结构的长度,。函数返回时,此整数值变为内核写入此套接字地质结构中的准确字节数。所以在这里填写client

第八个值:connectfd 在调用accept()函数,接受链接请求,返回已连接的套接字描述。第九个值:listenfd 是accept()函数的第一个参数,是由socket()函数产生的套接字描述符,在调用accept()函数前,已经调用listen()函数将此套接字变成监听套接字。

第十个值:&client 是accept()函数的第二个参数,表示客户端位置信息。并通过强制转

换,将网际套接字地址结构转换成通用套接字地址结构。所以这里填写&client

第十一个值:&addrlen是accept()函数的第三个参数,表示内核写的值,所以是一个指针区域。应该为客户端地址长度,在上面已经定义,所以这里为&addrlen

整句话作用:accept()函数使服务器接受客户端的连接请求。它将完成队列中的对头条目返回给进程,并产生一个新的套接字描述符,这个新生成的描述符成为“已连接套接字”当已完成队列为空时,进程睡眠,直到有已完成的链接到达时。

第十二个值:connectfd 发送消息给客户端,connectfd为客户端的文件描述符

第十三个值:connectfd

十四个值:listenfd

在关闭过程中,要先关闭已经连接的套接字,再关闭监听的套接字。如果直接关闭监听的套接字,已经连接的套接字还是可以进行读写等操作。

服务端执行顺序:socket(int family,int type,int protocol)

Bind(int sockfd,(const struct sockaddr *)server,socklen_len addrlen);

Listen(int sockfd,int backlog)

Accept(int sockfd,struct sockaddr * client, socklen_ *addrlen);

Read()

Write()

Close()

相关主题
相关文档
最新文档