socket基础
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
等待队列的长度,listen函数的第二个参数包括了未就绪的队列和已完成的队列,已完成的就是完成三次握手的队列,可以进行通信。未就绪的队列就是没有完成三次握手的队列。
accept和connect函数的参数一样,第一个就是套接字,第二个就是结构体指针,第三个就是结构体长度的指针
套接字的三种类型:流式套接字,数据报套接字,原始套接字。
协议族,AF_INET和AF_INET6两种常用的协议代表了ipv4和ipv6
指定的协议:tcp,udp;
1.什么是socket通信?
通过IP地址和端口号还有所采用的协议来把服务器和客户端之间建立连接,然后实现通信的一种方法。
2.sockaddr_in的用处
用于存储参与(IP)Windows套接字通信的计算机上的一个internet协议(IP)地址。
3.socket函数
第一个参数是代表协议族,协议族决定了socket的地址类型,在通信中必须采用对应的地址,常用的协议族有,AF_INET、AF_INET6、AF_LOCAL,如AF_INET 决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。第二个参数就代表了指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。第三个参数就是指定的协议,常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
2.为什么要建立两个套接字?(连接套接字和监听套接字)
因为第一个套接字由于使用了listen函数使得这个套接字一直处于监听到来的连接请求的状态,所以通过accept函数返回一个套接字来对用户所发出的信息和接受到的信息进行处理。就像是把第一个套接字比作火车站,第二个套接字比作是火车站的旅客,你要接旅客首先要在火车站去进行等待,看是否有需要的旅客(这个火车站一直在等待旅客的到来,这就是第一个套接字的作用),然后你想收钱的话应该应该是向旅客收而不是火车站,所以旅客也就是第二个套接字的作用。
3.listen函数的具体作用?
listen函数将主动套接字转换为被动监控套接字,其第二个参数backlog决定了内核的连接缓存队列长度。对于一个给定的监听套接字,内核维护两个队列,一个是未就绪队列,另一个是已完成的队列。backlog决定了两个队列的长度之和(并不是说两个队列之和等于backlog,而是存在个转换,依赖于具体实现),如果未就绪队列满则忽略新到来的SYN请求,对端重发,如果一直不能进入未就绪队列则对端connect失败返回。
4.accept函数的具体作用?
第一个是参数就是上面解释中的监听套接字,这个套接字用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号。当然客户不知道套接字这些细节,它只知道一个地址和一个端口号,第二个是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址
结构来描述的,用户应该知道这一个什么样的地址结构。如果对客户的地址不感兴趣,那么可以把这个值设置为NULL。第三个参数也是结果的参数,用来接受上述addr的结构的大小的,它指明addr结构所占有的字节个数。同样的,它也可以被设置为NULL。
5.那么,现在的困惑是,为什么send函数仅仅传入sockfd就可以知道服务器的ip和端口号?
其实,由“问题一”中的答案我们已经很清楚了,sockfd 描述符所描述的socket对象不仅包含了本地IP和端口,同时也包含了服务器的IP和端口,这样,才能使得send函数只需要传入sockfd 即可知道该把数据发向什么地方。而代码中,目的IP和端口只是在connect函数中出现过,因此,肯定是connect函数在成功建立连接后,将目的IP和端口写入了sockfd 描述符所描述的socket对象中。
6.socket中阻塞的工作方式和非阻塞的工作方式有什么区别?
阻塞模式和非阻塞模式的主要区别在于无请求来到时,阻塞模式会一直停在接收函数即accept函数,直到有请求到来才会继续向下进行处理。而非阻塞模式下,运行接收函数,如果有请求,则会接收请求,如果无请求,会返回一个负值,并继续向下运行。一般来说,使用阻塞模式的程序比较多,因为阻塞模式是由内核保障等待请求的,当他阻塞时不占用系统资源,而非阻塞模式需要我们人工轮询,占用资源较多。一旦建立好连接,客户端就可以通过该套接字和服务器端通信了。需要注意的是:因为是建立好了连接,所以使用send/recv发送/接收数据,无需指定对方的地址。但一个套接字只能connect一次。如果客户端要和其他的服务器通信的话,必须再创建一个流式套接字,重新连接。
8.connect函数的用法
sockfd是客户端创建的流式套接字;serv_addr指向存放服务器地址信息的结构体;addr_len是该结构体的长度。
对socket进行初始化
Wsadata
wsastartup
步骤:
服务器段:
1.初始化wsa
2建立套接字
3相关信息的绑定
4在指定进行监听
5接收连接
6进行通信
7断开连接
客户端:
1.初始化
1.创建套接字
2.与服务器端进行连接
3.发送和接收数据
4.断开连接