我想从头开始创建基本的HTTP客户端,使用SWIFT学习,以了解互联网上http的发送者和接收者是如何工作的.现在,我在本地主机上try ,我已经try 了以下代码

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)")
            }
        }
    }
}

Usage:

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

但问题是,Cleint的出口是print 101

我如何解决此问题?

推荐答案

通过Swift Forum的帮助,我知道网络接口上的UInt16端口号应该是bigEndian,而不是littleEndian.所以,解决办法是

serveraddr.sin_port = self.port.bigEndian

Swift相关问答推荐

在解码字符串时需要帮助.

按变换zoom 在UIView中不起作用

如何在SWIFT任务中判断当前任务是否已取消(异步/等待)

swift:只要框架名称中有一个带有框架名称的公共实体,就指定框架中公共 struct 的路径

相互取消任务

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

为什么自定义串行队列的目标是全局队列时,Swift中不会并发执行?

SwiftUI 交易:根据外部状态制作一个动画或静止的按钮

允许为 self 分配新的 struct 值的理由是什么?

如何在 macOS/AppKit 的窗口选项卡上接受拖动项目的放置?

URL appendPathComponent(_:) 已弃用?

Swift 包管理器 Package.resolved 文件末尾的版本是什么意思?

如何在 Swift 中将 XPC 自定义类列入白名单?

Swift 覆盖实例变量

我可以在 Swift 中为泛型类型 T 分配默认类型吗?

如何为多个类 Swift 进行扩展

try 在解除分配时加载视图控制器的视图... UIAlertController

Swift - 迭代 struct 对象时如何对其进行变异

在 xcode8 中找不到 ModuleName-Swift.h 文件

在 Swift 中从服务器播放视频文件