南京晓庄学院网络编程 实验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()