gpt4 book ai didi

sockets - 有人可以解释 "from socket import example"和 "import socket"之间的区别吗?

转载 作者:行者123 更新时间:2023-12-03 11:58:05 27 4
gpt4 key购买 nike

我是 Python 和网络新手,我知道我的问题可能听起来多余,但我花了几个小时研究 from socket import * 之间的区别和 import socket以及不同类型的套接字对象。我目前正在制作一个简单的数据包嗅探器,并且遇到了很多属性错误。我注意到如果我写 import socket并执行dir(socket)我得到:

AF_APPLETALK
AF_DECnet
AF_INET
AF_INET6
AF_IPX
AF_LINK
AF_ROUTE
AF_SNA
AF_SYSTEM
AF_UNIX
AF_UNSPEC
AI_ADDRCONFIG
AI_ALL
AI_CANONNAME
AI_DEFAULT
AI_MASK
AI_NUMERICHOST
AI_NUMERICSERV
AI_PASSIVE
AI_V4MAPPED
AI_V4MAPPED_CFG
AddressFamily
CAPI
CMSG_LEN
CMSG_SPACE
EAGAIN
EAI_ADDRFAMILY
EAI_AGAIN
EAI_BADFLAGS
EAI_BADHINTS
EAI_FAIL
EAI_FAMILY
EAI_MAX
EAI_MEMORY
EAI_NODATA
EAI_NONAME
EAI_OVERFLOW
EAI_PROTOCOL
EAI_SERVICE
EAI_SOCKTYPE
EAI_SYSTEM
EBADF
EWOULDBLOCK
INADDR_ALLHOSTS_GROUP
INADDR_ANY
INADDR_BROADCAST
INADDR_LOOPBACK
INADDR_MAX_LOCAL_GROUP
INADDR_NONE
INADDR_UNSPEC_GROUP
IPPORT_RESERVED
IPPORT_USERRESERVED
IPPROTO_AH
IPPROTO_DSTOPTS
IPPROTO_EGP
IPPROTO_EON
IPPROTO_ESP
IPPROTO_FRAGMENT
IPPROTO_GGP
IPPROTO_GRE
IPPROTO_HELLO
IPPROTO_HOPOPTS
IPPROTO_ICMP
IPPROTO_ICMPV6
IPPROTO_IDP
IPPROTO_IGMP
IPPROTO_IP
IPPROTO_IPCOMP
IPPROTO_IPIP
IPPROTO_IPV4
IPPROTO_IPV6
IPPROTO_MAX
IPPROTO_ND
IPPROTO_NONE
IPPROTO_PIM
IPPROTO_PUP
IPPROTO_RAW
IPPROTO_ROUTING
IPPROTO_RSVP
IPPROTO_TCP
IPPROTO_TP
IPPROTO_UDP
IPPROTO_XTP
IPV6_CHECKSUM
IPV6_DSTOPTS
IPV6_HOPLIMIT
IPV6_HOPOPTS
IPV6_JOIN_GROUP
IPV6_LEAVE_GROUP
IPV6_MULTICAST_HOPS
IPV6_MULTICAST_IF
IPV6_MULTICAST_LOOP
IPV6_NEXTHOP
IPV6_PKTINFO
IPV6_RECVTCLASS
IPV6_RTHDR
IPV6_RTHDR_TYPE_0
IPV6_TCLASS
IPV6_UNICAST_HOPS
IPV6_V6ONLY
IP_ADD_MEMBERSHIP
IP_DEFAULT_MULTICAST_LOOP
IP_DEFAULT_MULTICAST_TTL
IP_DROP_MEMBERSHIP
IP_HDRINCL
IP_MAX_MEMBERSHIPS
IP_MULTICAST_IF
IP_MULTICAST_LOOP
IP_MULTICAST_TTL
IP_OPTIONS
IP_RECVDSTADDR
IP_RECVOPTS
IP_RECVRETOPTS
IP_RETOPTS
IP_TOS
IP_TTL
IntEnum
LOCAL_PEERCRED
MSG_CTRUNC
MSG_DONTROUTE
MSG_DONTWAIT
MSG_EOF
MSG_EOR
MSG_OOB
MSG_PEEK
MSG_TRUNC
MSG_WAITALL
NI_DGRAM
NI_MAXHOST
NI_MAXSERV
NI_NAMEREQD
NI_NOFQDN
NI_NUMERICHOST
NI_NUMERICSERV
PF_SYSTEM
SCM_CREDS
SCM_RIGHTS
SHUT_RD
SHUT_RDWR
SHUT_WR
SOCK_DGRAM
SOCK_RAW
SOCK_RDM
SOCK_SEQPACKET
SOCK_STREAM
SOL_IP
SOL_SOCKET
SOL_TCP
SOL_UDP
SOMAXCONN
SO_ACCEPTCONN
SO_BROADCAST
SO_DEBUG
SO_DONTROUTE
SO_ERROR
SO_KEEPALIVE
SO_LINGER
SO_OOBINLINE
SO_RCVBUF
SO_RCVLOWAT
SO_RCVTIMEO
SO_REUSEADDR
SO_REUSEPORT
SO_SNDBUF
SO_SNDLOWAT
SO_SNDTIMEO
SO_TYPE
SO_USELOOPBACK
SYSPROTO_CONTROL
SocketIO
SocketKind
SocketType
TCP_MAXSEG
TCP_NODELAY
_GLOBAL_DEFAULT_TIMEOUT
_GiveupOnSendfile
_LOCALHOST
_LOCALHOST_V6
__all__
__builtins__
__cached__
__doc__
__file__
__loader__
__name__
__package__
__spec__
_blocking_errnos
_intenum_converter
_realsocket
_socket
create_connection
dup
errno
error
fromfd
gaierror
getaddrinfo
getdefaulttimeout
getfqdn
gethostbyaddr
gethostbyname
gethostbyname_ex
gethostname
getnameinfo
getprotobyname
getservbyname
getservbyport
has_ipv6
herror
htonl
htons
if_indextoname
if_nameindex
if_nametoindex
inet_aton
inet_ntoa
inet_ntop
inet_pton
io
ntohl
ntohs
os
selectors
setdefaulttimeout
sethostname
socket
socketpair
sys
timeout

Process finished with exit code 0

现在,如果我将其更改为 from socket import *我得到:
__class__
__delattr__
__dir__
__doc__
__enter__
__eq__
__exit__
__format__
__ge__
__getattribute__
__getstate__
__gt__
__hash__
__init__
__le__
__lt__
__module__
__ne__
__new__
__reduce__
__reduce_ex__
__repr__
__setattr__
__sizeof__
__slots__
__str__
__subclasshook__
__weakref__
_accept
_check_sendfile_params
_closed
_decref_socketios
_io_refs
_real_close
_sendfile_use_send
_sendfile_use_sendfile
accept
bind
close
connect
connect_ex
detach
dup
family
fileno
get_inheritable
getpeername
getsockname
getsockopt
gettimeout
listen
makefile
proto
recv
recv_into
recvfrom
recvfrom_into
recvmsg
recvmsg_into
send
sendall
sendfile
sendmsg
sendto
set_inheritable
setblocking
setsockopt
settimeout
shutdown
timeout
type

Process finished with exit code 0

我不明白。为什么他们如此不同?当我以一种方式导入时,一件事没有属性,当我以另一种方式导入时,另一件事没有属性。似乎一种类型的导入访问套接字库中的所有常量,而另一种方式将访问这些方法。我觉得这与一个可以制作的不同类型的套接字对象有关,但我不太确定。我会发布我的代码,以防万一我写的东西有问题:
import socket
import os

class Sniff:
def __init__(self, HOST):
self.HOST = HOST
self.sniffer = socket

def sniff_packet(self, host, win, socket_prot):
self.sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_prot)
self.sniffer.bind((host, 80))
self.sniffer.setsocketopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

if win == 1:
self.sniffer.iotcl(socket.SIO_RCVALL, socket.RCVALL_ON)

print(self.sniffer.recvfrom(65565))


def main(self):
if os.name == 'nt':
self.sniff_packet(self.HOST, 1, socket.IPPROTO_IP)
else:
self.sniff_packet(self.HOST, 0, socket.IPPROTO_IP)

sniffObj = Sniff(input("Enter your network address: "))
sniffObj.main()

以下是我在运行此代码时遇到的一些错误,具体取决于我导入套接字的方式:
1) import socket :
Traceback (most recent call last):
File "PacketSniffer.py", line 28, in <module>
sniffObj.main()
File "PacketSniffer.py", line 25, in main
self.sniff_packet(self.HOST, 0, socket.IPPROTO_IP)
File "PacketSniffer.py", line 13, in sniff_packet
self.sniffer.setsocketopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
AttributeError: 'socket' object has no attribute 'setsocketopt'

2) from socket import *
Traceback (most recent call last):
File "PacketSniffer.py", line 28, in <module>
sniffObj.main()
File "PacketSniffer.py", line 25, in main
self.sniff_packet(self.HOST, 0, socket.IPPROTO_IP)
AttributeError: type object 'socket' has no attribute 'IPPROTO_IP'

请帮我!我想更好地了解套接字以及它们是如何工作的,我希望我的问题能帮助那些和我遇到同样问题的人。

最佳答案

Why are they so different?


dir(socket) 的输出是不同的,因为 socket在这两种情况下不是同一个对象。
>>> import socket
>>> type(socket)
<class 'module'>
>>> type(socket.socket)
<class 'type'>

对比
>>> from socket import *
>>> type(socket)
<class 'type'>
import socket不进入 socket 当前符号表中模块的定义;它只进入模块 socket那里。使用前导模块名称,您可以访问定义,例如。 G。 socket.socket (其中尾随的 socket 是套接字对象的类型)。
from socket import *输入所有 socket 在当前符号表中,模块的定义不以下划线开头,因此,只需 socket是套接字对象的类型。

关于sockets - 有人可以解释 "from socket import example"和 "import socket"之间的区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34168698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com