【问题标题】:Receiving a TCP packet in Swift在 Swift 中接收 TCP 数据包
【发布时间】:2017-08-28 10:27:59
【问题描述】:

我想使用 sacpy 从服务器 (Python) 向客户端 (Swift) 发送 TCP 数据包。 从服务器发送消息:

packet = IP() / TCP() / Raw()
print(CLIENT_IP, CLIENT_PORT)
packet[IP].dst = CLIENT_IP
packet[TCP].dport = CLIENT_PORT
#packet[Raw].load = str(to_text(places_list))
#print(str(to_text(places_list)))
packet[Raw].load = "HELLO WORLD"

send(packet)

swift中的代码基于:HTTP Request in Swift with POST method

快速接收代码:

var request = URLRequest(url: URL(string: "http://10.172.0.136:80")!)
    request.httpMethod = "POST"
    let postString = "x=30&y=10&name=hello"
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                                                 // check for fundamental networking error
            print("error=\(String(describing: error))")
            return
        }

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
        }
        let responseString = String(data: data, encoding: .utf8)
        print("responseString = \(String(describing: responseString))")
        print("response = \(String(describing: response))")
    }
    task.resume()

数据包是从服务器发送的,但客户端没有收到。 我尝试将数据包发送到端口,从该端口将消息从客户端发送到服务器。还尝试发送到端口 80 (HTTP)。 在这两种情况下,错误都是:(10.172.0.136 是服务器的 IP)

error=Optional(Error Domain=NSURLErrorDomain Code=-1005 "网络连接丢失。" UserInfo={NSUnderlyingError=0x608001043330 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={_kCFStreamErrorCodeKey=-4 , kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=http://10.172.0.136:80/, NSErrorFailingURLKey=http://10.172.0.136:80/, kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-4, NSLocalizedDescription=网络连接丢失。})

我认为问题出在客户端的接收中(使用 Wireshark 我看到消息被正确嗅探)。 有没有简单的方法来修复我的代码?如果真的无法修复,请问还有什么方法可以快速接收数据包?

【问题讨论】:

    标签: python swift networking tcp


    【解决方案1】:

    您的问题是您未正确使用 TCP。您正在尝试在已建立的连接之外发送单个数据包,但未能指定将其与 HTTP 请求关联所需的任何字段。

    不要为此使用 Scapy。 (除非你需要为某种学术活动这样做。)这完全是错误的工作工具。使用 HTTP 服务器——如果你想要一个简单的 Python 服务器,内置的 SimpleHTTPServer 是一个合理的起点。

    【讨论】:

    • 谢谢。最后我使用了 Bottle 框架而不是 SimpleHTTPServer,效果很好。
    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2012-09-27
    • 2010-12-10
    • 2016-12-16
    • 2011-09-09
    相关资源
    最近更新 更多