标签:取值 方式 evel tcpip 次数 流量 网关 就会 暂停
ISO(国际标准化组织)
制定了
Ps.
网络协议:在网络通信中双方都遵循的规定。包括建立什么样的网络结构、消息结构、标示代表什么等。
物理层:IEEE
ifconfig/ipconfig
:查看IP
获取计算机名
In [2]: socket.gethostname()
Out[2]: ‘EnweiHaos-MacBook-Pro.local‘
In [3]: socket.gethostbyname('EnweiHaos-MacBook-Pro.local')
Out[3]: '192.168.2.104''
IPv6:128位
ping ip
:测试和某台网络主机是否联通
通过地址获取主机网络信息
In [7]: socket.gethostbyaddr(‘www.baidu.com‘)
Out[7]: (‘127.0.0.1‘, [], [‘119.75.216.20‘])
主机名 别名 网络地址
点分十进制地址转换为二进制
In [9]: socket.inet_aton(‘192.168.1.2‘)
Out[9]: b‘\xc0\xa8\x01\x02‘
二进制地址转换为点分十进制
In [10]: socket.inet_ntoa(b‘\xc0\xa8\x01\x02‘)
Out[10]: ‘192.168.1.2‘
在一个操作系统中不同的网络应用监听不同的端口号
网络字节序: 数据在网络中的传输格式
- osi七层模型介绍一下,tcp/ip模型呢?
- tcp服务和udp服务有什么区别?
- 三次握手和四次挥手是什么意思,过程是怎样的?
面向连接的传输--TGP协议--可靠地--流式套接字
面向无连接传输--UDP协议--不可靠--数据报套接字
import socket
sockfd = socket.socket(socket_family = AF_INET,
socket_type = SOCK_STREAM,
proto = 0)
sockfd.bind(addr)
参数:元组(ip,port)
sockfd.listen(n)
connfd, addr = sockfd.accept()
data = connfd.recv(buffersize)
返回值:接收到的内容
如果没有消息则会阻塞
n = connfd.send(data)
返回值:返回实际发送消息的大小
sockfd.close()
# tcp_server.py
from socket import *
# 创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
# 绑定地址
sockfd.bind(('0.0.0.0',9900))
# 设置监听
sockfd.listen(5)
# 等待接受连接
print("Waiting for connect...")
connfd,addr = sockfd.accept()
print("Connect from",addr)
while True:
# 收发消息
data = connfd.recv(1024).decode()
if data == "##":
break
print(data)
n = connfd.send(b'Receive your message')
print("发送了%d字节" % n)
# 关闭套接字
connfd.close()
sockfd.close()
# telnet macOS下载:https://blog.csdn.net/licheng70356213/article/details/81162660
# $ telnet 127.0.0.1 9996
# Trying 127.0.0.1...
# Connected to localhost.
# Escape character is '^]'.
# hello
# Receive your messageConnection closed by foreign host.
创建套接字
必须相同类型的套接字才能通信
关闭套接字
# tcp_client.py
from socket import *
# 创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
# 发起连接
server_addr = ('192.168.207.129',9900)
sockfd.connect(server_addr)
while True:
# 消息发送接收
data = input("发送>>")
sockfd.send(data.encode())
if data == '##':
break
data = sockfd.recv(1024)
print("接受到:",data.decode())
# 关闭套接字
sockfd.close()
send和recv实际上是和缓冲区进行交互,发送缓冲区满时就无法发送,接收缓冲区满时recv才阻塞
例如:connfd.recv(5)
若超过五个则会重复运行,直到发送完成
sockfd = socket(AF_INET,SOCK_DGRAM)
sockfd.bind(addr)
data,addr = sockfd.recvfrom(buffersize)
一次接收一个数据报,如果数据报大小大于buffersize则会丢失部分消息
sockfd.sendto(data,addr)
sockfd.close()
from socket import *
#创建数据报套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
#绑定服务端地址
server_addr = ('0.0.0.0',9999)
sockfd.bind(server_addr)
#消息收发
while True:
data,addr = sockfd.recvfrom(5)
print("Receive from %s:%s"% (addr,data.decode()))
sockfd.sendto('收到你的消息'.encode(),addr)
sockfd.close()
$ python udp_clinet.py 123 321 > sys.argv = [‘udp_clinet.py‘,‘123‘, ‘321‘]
直接执行程序
在程序的第一行加
添加程序的执行权限
chmod 755 file.py
修改后即可通过 ./file.py 运行程序
from socket import *
import sys
if len(sys.argv) < 3:
print('''
argv is error!
run as
python3 udp_client.py 127.0.0.1 9999
''')
raise
#从命令行输入IP,端口
HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST,PORT)
#创建套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
#消息收发
while True:
data = input("消息:")
if not data:
break
sockfd.sendto(data.encode(),ADDR)
data,addr = sockfd.recvfrom(1024)
print("从服务器收到:",data.decode())
sockfd.close()
sendall(data)
文件描述符是操作系统识别IO的唯一标志
stdin ---> 0
stdout --> 1
stderr --> 2
s.getpeername():获取客户端连接套接字的对应地址
如果要设置套接字选项,最好在创建套接字之后立即设置
from socket import *
s = socket()
#设置端口立即释放
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
#获取套接字选项值
print(s.getsockopt(SOL_SOCKET,SO_REUSEADDR))
#获取套接字地址族类型
print(s.family)
#获取套接字类型
print(s.type)
s.bind(('127.0.0.1',9998))
#获取绑定地址
print(s.getsockname())
#获取套接字文件描述符
print(s.fileno())
s.listen(5)
while True:
c,addr = s.accept()
print("Connect from",c.getpeername())
c.recv(1024)
标签:取值 方式 evel tcpip 次数 流量 网关 就会 暂停
原文地址:https://www.cnblogs.com/haoenwei/p/10647851.html