socket编程

本文详细介绍了TCP与UDP两种传输层协议的编程方法,并对比了它们之间的区别。同时,还探讨了socket选项如SO_REUSEADDR等的功能及用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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编程的区别

客户端

#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()

#TCP
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()

服务端

#UDP
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)

#TCP
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:#打开socket
    s.connect((host,port))                                  #连接至服务器,开始握手
    s.sendall(b'Hello World')
    data = s.recv(1024)
                                                            #with结束,调用close()开始挥手
print("receive:",repr(data))

#服务端
import socket
host = ""
port = 50007
with 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连接

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值