socket编程

来源:互联网 发布:富途证券招聘网络销售 编辑:程序博客网 时间:2024/06/07 07:06
  • setsocketopt(level, optname, value)

  • getsocketopt(level, optname[, buflen])

  • level一般是SOL_SOCKET, 表示使用socket选项

optname选项名 意义 返回值 SO_BINDTODEVICE 只在某个特殊网卡有效,可能不是移动设备 一个字符串返回设备名称,或默认为空 SO_BROADCAST 允许广播地址发送和接受信息包,只对UDP有效 布尔值 SO_DONTROUTE 禁止通过路由器和网关往外发送信息包,为了安全 布尔值 SO_KEEPALIVE 可以使TCP通信的信息包保持连续性。 布尔值 SO_OOBINLINE 把收到的不正常数据视为正常数据 布尔值 SO_REUSEADDR 当socket被关闭后,占用的端口号能马上重用,不再保留几分钟 布尔值 SO_TYPE 得到传输层协议,只用于get 整数

TCP和UDP编程的区别

客户端

#UDPfrom socket import *serverName = "hostname"serverPort = 12000clientSocket = socket(AF_NET,SOCK_DGRAM)msg = raw_input("input sonething")clientSocket.sendto(msg,(serverName,serverPort))recvMsg, serverAddr = clientSocket.recvFrom(2048)print(recvMsg)clientSocket.close()#TCPfrom socket import *serverName = "hostname"serverPort = 12000clientSocket = socket(AF_INET, SOCK_STREAM)clientSocket.connect((serverName,serverPort))msg = raw_input("input something")clientSocket.send(msg)recvMsg = clientSocket.recv(1024)print(recvMsg)clientSocket.close()

服务端

#UDPfrom socket import *serverPort = 12000ServerSocket = socket(AF_INET, SOCK_DGRAM)serverSocket.bind(("",serverPort))print("The server is prepared")while True:    msg,clientAddr = serverSocket.recvfrom(2048)    sendMsg = msg.upper()    serverSocket.sendto(sendMsg,clientAddr)#TCPfrom socket import *serverPort = 12000ServerSocket = socket(AF_INET, SOCK_STREAM)serverSocket.bind(("",serverPort))serverSocket.listen(1)print("The server is prepared")while True:    connnectedSocket,addr = serverSocket.accept()    msg = connectedSocket.recv(1024)    sendMsg = msg.upper()    connectedSocket.close()

Socket角度理解TCP连接

socket库允许访问本地C套接字库,通过控制网络层协议与传输层协议来控制如何发送数据

import sockets = socket.socket(AF_INET, SOCK_STREAM)
网络层协议 传输层协议 AF_INET(IPv4) SOCK_STEAM(TCP) AF_INET(IPv6) SOCK_DGRAM(UDP) AF_UNIX(使用UNIX操作系统)
#客户端import sockethost = "localhost"port = 50007with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:#打开socket    s.connect((host,port))                                  #连接至服务器,开始握手    s.sendall(b'Hello World')    data = s.recv(1024)                                                            #with结束,调用close()开始挥手print("receive:",repr(data))#服务端import sockethost = ""port = 50007with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:#打开socket    s.bind((host,port))                                     #绑定端口    s.listen(1)                                             #每次只处理一个连接请求    conn, addr = s.accept()                                 #当客户端发送请求,开始握手    with conn:        print("Connected by ",addr)        while True:            data = conn.recv(1024)            if not data: break                             #客户端close()            conn.sendall(data)                                                           #内部with代码块,调用close()

建立TCP连接

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述