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编程的区别
客户端
from socket import *
serverName = "hostname"
serverPort = 12000
clientSocket = socket(AF_NET,SOCK_DGRAM)
msg = raw_input("input sonething")
clientSocket.sendto(msg,(serverName,serverPort))
recvMsg, serverAddr = clientSocket.recvFrom(2048)
print(recvMsg)
clientSocket.close()
from socket import *
serverName = "hostname"
serverPort = 12000
clientSocket = 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()
服务端
from socket import *
serverPort = 12000
ServerSocket = 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)
from socket import *
serverPort = 12000
ServerSocket = 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 socket
s = socket.socket(AF_INET, SOCK_STREAM)
网络层协议 | 传输层协议 |
---|
AF_INET(IPv4) | SOCK_STEAM(TCP) |
AF_INET(IPv6) | SOCK_DGRAM(UDP) |
AF_UNIX(使用UNIX操作系统) | |
import socket
host = "localhost"
port = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host,port))
s.sendall(b'Hello World')
data = s.recv(1024)
print("receive:",repr(data))
import socket
host = ""
port = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
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
conn.sendall(data)
建立TCP连接
