zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Socket原理与编程基础

2023-09-11 14:17:15 时间

•socket简介

  socket是进行通讯的一种方式,即调用这个网络库的一些api韩寒苏实现分布在不同主机的相关进程之间的数据交换。

  名词定义:

    1)IP地址:依照TCP/IP协议分配给本地主机的网络地址,2个进程要通信,任一进程首先要知道通讯对方的位置,即IP地址。

    2)端口号:用来辨别本地通讯进程,一个本地的基尼从在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有访问的端口号。

    3)连接:两个进程间的通讯链路

 

•客户/服务端模式

  •服务端:其过程是首先服务器放要先开启,并根据请求提供相应的服务。

  1)打开一通信通道并告知本地主机,他愿意在某一个公认地址上某端口接收客户请求

  2)等待客户请求到到该端口

  3)接收到客户端的请求时,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求,新进程处理此客户请求并不需要对其请求做出应答。服务完成后,关闭新进程与客户的通信链路,并终止。

  4)返回第2步骤,等待另外一个客户请求

  5)关闭服务器

  •客户端:

  1)打开-通信通道,并连接到服务器所在主机的特定端口

  2)向服务器发请求报文,等待并接收应答,继续提出请求

  3)请求结束后关闭通道并终止。

  •说明:

  1)从上面的模式来看,流程会有所不同,因此其代码也会不同

  2)服务器进程先启动,主要系统运行,该服务进行就一直存在,知道进程关闭。

 

•常见API函数

  1)socket():创建套接字,-- create a new socket object

  2)bind(address):绑定本地地址,必须确保之前没有绑定过。

  3)close():

  4)accept(self):

     accept() -> (socket object, address info)  返回connection、address对,其中connection是新的socket对象,可以在上面发送和接收数据,address是另一端的socket地址

  5)connect(address):连接该地址上的远端socket

  6)getsockname():getsockname() -> address info    返回socket自己的地址,对查找端口号有用

  7)listen(backlog):监听socket连接,参数表示最大连接队列数,通常为5,最小为0

  8)recv(bufsize):recv(buflen[, flags]) -- receive data   接收数据,返回表示接收到数据的string。bufsize表示一次接收到的数据最大量

  9)send(string):发送数据,返回发送的数据量,程序自己负责检查是否所有的数据已发送并自己处理未发送的数据

  10)sendall(string):sendall(data[, flags])     发送数据,该函数会持续发送数据知道数据发送完毕或出现错误为止。若发送成功返回none。

  11)settimeout():

      设置阻塞模式下socket的超时时间,其值以秒计算,若给定float,socket的后续操作若在给定超时时间内没有完成,将触发timeout异常。

  12)gettimeout():返回超时时间,单位秒或None

  13)gethostname():gethostname() -> string    返回当前主机名,--return the current hostname

  14)gethostbyname():

      gethostbyname(host) -> address    通过主机名获取IP地址,参数为主机名,如:PC-20150412FUUA-- map a hostname to its IP number

  15)gethostbyaddr():

      gethostbyaddr(host) -> (name, aliaslist, addresslist)     参数为主机名或IP地址 -- map an IP number or hostname to DNS info,如:('PC-20150412FUUA', [], ['fe80::349b:92dc:1bb2:58ca'])

  16)getservbyname():

      socket.getservbyname('http','tcp')   参数:将服务名和一个协议名,返回的是端口号-- map a service name and a protocol name to a port number