“黑客”深度进修之“Socket收集编程详解”
用措施在行使套接字前,起首必需拥有一个套接字,体系挪用socket()向应用措施提供建设套接字的本领,其挪用名目如下:
该挪用要吸取三个参数:af、type、protocol。参数af指定通讯产生的地区:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网地区。因此,地点族与协议族沟通。参数type 描写要成立的套接字的范例。这里分三种:
参数protocol声名该套接字行使的特定协议,假如挪用者不但愿出格指定行使的协议,则置为0,行使默认的毗连模式。按照这三个参数成立一个套接字,并将响应的资源分派给它,同时返回一个整型套接字号。因此,socket()体系挪用现实上指定了相干五元组中的"协议"这一元。 1. 指定当地地点──bind() 当一个套接字用socket()建设后,存在一个名字空间(地点族),但它没有被定名。bind()将套接字地点(包罗当田主机地点和当地端口地点)与所建设的套接字号接洽起来,即将名字赋予套接字,以指定当地半相干。其挪用名目如下:
参数s是由socket()挪用返回的而且未作毗连的套接字描写符(套接字号)。参数name 是赋给套接字s的当地地点(名字),其长度可变,布局随通讯域的差异而差异。namelen表白了name的长度。假如没有错误产生,bind()返回0。不然返回SOCKET_ERROR。 2. 成立套接字毗连──connect()与accept() 这两个体系挪用用于完成一个完备相干的成立,个中connect()用于成立毗连。accept()用于使处事器守候来自某客户历程的现实毗连。 connect()的挪用名目如下:
参数s是欲成立毗连的当地套接字描写符。参数name指出声名对方套接字地点布局的指针。对方套接字地点长度由namelen声名。 假如没有错误产生,connect()返回0。不然返回值SOCKET_ERROR。在面向毗连的协议中,该挪用导致当地体系和外部体系之间毗连现实成立。 因为地点族总被包括在套接字地点布局的前两个字节中,并通过socket()挪用与某个协议族相干。因此bind()和connect()无须协议作为参数。 accept()的挪用名目如下:
参数s为当地套接字描写符,在用做accept()挪用的参数前应该先挪用过listen()。addr 指向客户方套接字地点布局的指针,用来吸取毗连实体的地点。addr简直切名目由套接字建设时成立的地点族抉择。addrlen 为客户方套接字地点的长度(字节数)。假如没有错误产生,accept()返回一个SOCKET范例的值,暗示吸取到的套接字的描写符。不然返回值INVALID_SOCKET。 accept()用于面向毗连处事器。参数addr和addrlen存放客户方的地点信息。挪用前,参数addr 指向一个初始值为空的地点布局,而addrlen 的初始值为0;挪用accept()后,处事器守候从编号为s的套街勺酉接管客户毗连哀求,而毗连哀求是由客户方的connect()挪用发出的。当有毗连哀求达到时,accept()挪用将哀求毗连行列上的第一个客户方套接字地点及长度放入addr 和addrlen,并建设一个与s有沟通特征的新套接字号。新的套接字可用于处理赏罚处事器并发哀求。 四个套接字体系挪用,socket()、bind()、connect()、accept(),可以完成一个完全五元相干的成立。socket()指定五元组中的协议元,它的用法与是否为客户或处事器、是否面向毗连无关。bind()指定五元组中的当地二元,即当田主机地点和端标语,其用法与是否面向毗连有关:在处事器方,无论是否面向毗连,均要挪用bind(),若回收面向毗连,则可以不挪用bind(),而通过connect()自动完成。若回收无毗连,客户方必需行使bind()以得到一个独一的地点。 3. 监听毗连──listen() 此挪用用于面向毗连处事器,表白它乐意吸取毗连。listen()需在accept()之前挪用,其挪用名目如下:
参数s标识一个当地已成立、尚未毗连的套接字号,处事器乐意从它上面吸取哀求。backlog暗示哀求毗连行列的最大长度,用于限定列队哀求的个数,今朝应承的最大值为5。假如没有错误产生,listen()返回0。不然它返回SOCKET_ERROR。 listen()在执行挪用进程中可为没有挪用过bind()的套接字s完成所必需的毗连,并成立长度为backlog的哀求毗连行列。 挪用listen()是处事器吸取一个毗连哀求的四个步调中的第三步。它在挪用socket()分派一个流套接字,且挪用bind()给s赋于一个名字之后挪用,并且必然要在accept()之前挪用。 4. 数据传输──send()与recv() 当一个毗连成立往后,就可以传输数据了。常用的体系挪用有send()和recv()。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |