在 Swift 中从头开始构建基本 HTTP 客户端

问题描述 投票:0回答:1

我想使用 Swift 从头开始创建基本的 HTTP 客户端,以达到学习目的,以了解互联网上 http 的发送者和接收者是如何工作的。现在我正在本地主机中尝试,我尝试了下面的代码

import Foundation
import Darwin

final class Client {
    
    let host: String
    let port: UInt16
    
    init(host: String, port: UInt16) {
        
        self.host = host
        self.port = port
    }
    
    func get(_ completionHandler: @escaping() -> Void) {
        
        // Create a socket
        let sock = socket(AF_INET, SOCK_STREAM, 0)
 
        var serveraddr = sockaddr_in()
        serveraddr.sin_family = sa_family_t(AF_INET)
        serveraddr.sin_port = self.port
        serveraddr.sin_addr.s_addr = inet_addr(self.host)

        // Connect to the server
          
        print("Connecting....")
        
        withUnsafePointer(to: &serveraddr) { sockaddrInPtr in
          
            let sockaddrPtr = UnsafeRawPointer(sockaddrInPtr).assumingMemoryBound(to: sockaddr.self)
            let connection = connect(sock, sockaddrPtr, socklen_t(MemoryLayout<sockaddr_in>.size))
             
            if connection == 0 {
                
                // Form an HTTP GET request
                let request = "GET / HTTP/1.1\r\nHost: \(self.host)\r\n\r\n"
                let bytes = [UInt8](request.data(using: .utf8)!)

                // Send the request over the socket
                send(sock, bytes, request.count, 0)

                /*
                // Receive and print the response
                var response = [UInt8](repeating: 0, count: 1024)
                let bytesRead = recv(sock, &response, response.count, 0)
                if bytesRead > 0 {
                    if let httpResponse = String(bytes: response, encoding: .utf8) {
                        print(httpResponse)
                    }
                }

                // Close the socket
                close(sock)
                 */
                
            } else {
                
                print("not connected \(connection)")
            }
        }
    }
}

用途:

let client: Client = .init(host: "127.0.0.1", port: 8080)
client.get {
                
     print("GET request successfully executed!")
}

但问题是 cleint 退出时是

print
not connected -1

如何解决这个问题?

swift linux macos httpurlconnection
1个回答
0
投票

通过 Swift Forum 的帮助,我知道网络接口上的 UInt16 端口号应该是

bigEndian
,但绝不是
littleEndian
。所以,解决方法是

serveraddr.sin_port = self.port.bigEndian

© www.soinside.com 2019 - 2024. All rights reserved.