我对python比较陌生,所以请体谅...
我正在通过 raw_sockets 实现服务器和客户端。我有必要的特权。
现在,我这样定义的服务器:
host = socket.gethostbyname(socket.gethostname())
address = (host, 22224)
sockSer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sockSer.bind(address)
sockSer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
packet, addr = sockSer .recvfrom(4096) # wait for packet from client
Q1)为什么我不能简单地输入:hosts = 'localhost'。如果我这样做,它不允许我写这行:sockSer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)。然后服务器没有收到我客户的消息。只有当做 gethostbyname(socket.gethostname()) 我得到 192.168.1.101 然后它工作。
在不同的类中:客户端套接字:
host = socket.gethostbyname(socket.gethostname())
address = (host, 22224)
sockCli = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
Q2)我还需要输入:sockCli.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) 还是 sockCli.connect(address)?似乎它在没有连接命令的情况下工作。对于客户端套接字?
现在,当我执行以下操作时出现问题:1)从客户端向服务器发送数据包:
header=...
payload='a'
sockCli.sendto(header + payload, address)
2)在服务器中接收数据包并将某些内容发送回客户端:
while(true):
data, addr = sockSer.recvfrom(4096)
header2=...
payload2='b'
sockSer.sendto(header2 + payload2, addr)
现在,我的重要问题是: Q3)服务器仅向客户端发送了 1 个数据包,有效负载为“b”。发生的情况是,我的客户端实际上在 while 循环中接收到 2 个数据包:第一个数据包是客户端自己发送到服务器的数据包,另一个数据包是客户端从服务器获得的数据包。因此我的输出是 'ab' 而不是简单的 'b' 为什么会发生这种情况???
注意:我没有输入整个代码,但我认为我的语法、解析、标题组合等是正确的。我的代码中有明显的问题吗?如有必要,我将上传整个代码。
谢谢