【筆記】和各大AI大語言模型合作寫項目—slirp.go

最近和各大AI大語言模型一起合作寫了個小項目,讓大家看看AI離取代人類還差多遠。

開發大家都在一個共享環境下,連docker都不能運行,rootless也沒有。不過好在linux環境,弄個proot能apt或者yum install自由,但是諸如podman這樣的程序還是沒法運行。一陣惱火,于是下載了linux kernel直接ARCH=um編譯出user mode linux,我自己運行自己的內核總可以了吧。

喜滋滋編譯完,好了,這個kernel沒有網絡。挖墳找找自己以前寫的文章看看當時怎么配置user mode linux的,結果是要tun/tap設備,這個需要管理員先開一些權限,在rootless下可以用,但是這個權限沒開啊…

于是開始到處找不用tun/tap的方法。發現了user mode linux的網絡可以支持daemonslirp模式,這不是很好么。于是興沖沖跑去github搜索一下,有些好些年前的項目,編譯出來,怎么都不能運行?daemon模式有點復雜的,相當于需要從二層網絡開始處理…而slirp是三層網絡,只處理ip packet。

那我只要有個程序處理這些ip packet連上internet,我的user mode linux不就可以聯網了么。于是喊上LLM,這還不簡單。

首先登場的當然是寫代碼目前最強的Claude4,讓它用c寫一個簡單的slirp程序,結果程序是能一次性編譯通過,但是好像用user mode linux加載沒什么反應。然后嘗試了下gemini2.5pro,gpt4o,qwen3,都不能一次性編譯通過了都…

這下遇到瓶頸了,很煩躁。繼續手動搜索,突然找到了libslirp,眼前一亮。于是讓claude4用c和libslirp寫一個簡單的slirp程序,程序有一處錯誤改正下就能正常編譯了,但是運行以后還是什么都沒有。于是手動從libslirp的gitlab上扒下來一個ping的example,發現編譯不過,原來是libslirp最新已經4.9了,一般linux源里的都還是4.4,版本號改變不大但是內部api有一些大動靜…加上文檔寫得很差,AI都寫得不太對了。(所以知道了吧,要想不被AI取代,請把項目文檔寫差一點…目前為止我讓AI寫調用公司產品API的代碼復雜的就沒有對過的,發現它被文檔毒害得不淺,或者說產品文檔實在質量太差,連參數都能列錯…而開發k8s operator代碼剛剛的,因為人家文檔不錯,正確案例也多…)

寫了半天,發現這個libslirp好像只是一個網絡packet封裝啊,看完文檔發現它還是要靠一些手段諸如tun/tap連到外面…我要是能這么做,早就iptables配置好了啊…然后還試用了下slirp4netns(unshare -> no permission),同樣的問題…

然后繼續搜索引擎,突然找到了個pySLiRP,它是需要一個/dev/usbXXX設備作中介,通過PPP協議傳輸packet數據的。于是我又仔細看了下slirp的說明,據說是通過stdin和stdout交換數據。于是拿到這個pySLiRP以后,看了下它是通過打開usb設備設定baud rate通信的,我讓AI寫點代碼把它替換掉不就好了?于是讓claude4和gemini2.5pro比賽寫代碼,因為pySLiRP用的是asyncio,它通過第三方庫打開usb設備得到async的readerwriter,這下目標明確,讓倆模型寫一段python代碼將stdin和stdout轉化為async的readerwriter。嗶嗶嗶,代碼寫得很快,claude4響應比gemini快不少,質量也好很多,但是有些時候claude4沒處理好的細節可能gemini可以補上一些,所以基本我還是喜歡讓2個模型一起寫代碼,增加成功率(qwen3的代碼能力確實還是有待提高的,大部分時候不能滿足開發要求,所以這里暫時選了claude4+gemini2.5pro)。這次AI的代碼直接放到原有代碼里,把接口換成調用AI的代碼,一次性成功。我還讓AI給加了dump hex數據到stderr的代碼。運行user mode linux,配置網絡,ping一下某個ip,然后終于有數據打印到stderr了。

因為網絡知識奇差無比,這些hex是啥意思?直接問AI好了,解釋下這坨binary是什么意思。哦,很給力,兩個AI都解析出了這坨binary是一個ip packet,并且是一個icmp ping的packet,只是兩頭多了0xc0。這里claude說不知道這是啥意思,但是gemini給出了猜測,根據這個0xc0,很像是slip的protocol。

然后再去查slip protocol,原來就是一些encode/decode的約定。這時候再讀pySLiRP的代碼,用了一套PPP protocol,牛頭不對馬嘴啊…但是有了最基礎的輸入輸出數據樣本,我又試了一下libslirp,完全不知道怎么控制它啊…算了,用raw的形式先把ping搞定,至少要先讓ping有unreachable host輸出。

于是先讓AI寫了倆函數去encode和decode slip,這樣我們從stdin拿到數據,然后decode以后就是一個純ip packet了。然后讓AI寫一個函數,如果我有一個ping的ip packet,解析之后生成一個unreachable host的ping response。對于這種特別明確的任務,claude4可怕的地方就來了,一次性寫對,直接使用。于是我們有了第一個slirp的python版本——slirp.py。放到user mode linux里,配置好網絡,ping一下,穩定得到unreachable host了!甚至其他curl或者網絡請求都會得到“無響應”的響應。最初版本成功!

寫到這里突然意識到目前這個項目實際上是寫一個程序,這個程序要求是一邊處理ip packet,另一邊處理和外界的聯系,有點像NAT,或者更像proxy,但是不同的地方是兩邊處理的粒度不一樣。比如ping,我們得到ip packet,然后我們要把icmp的payload拿到,然后使用user mode下的socket發送這些payload,再得到response payload,并且構造ip packet去響應user mode linux的網絡請求。

所以剛才的unreachable host版本寫完以后,我讓AI寫一個程序,可以rootless得發送icmp payload,并且得到icmp response,并生成一個可用得response ip packet…把這次的代碼和最初版本接起來,得到一個可以ping外部ip的slirp版本。當然,如果是ping內部同虛擬網段的機器,我們還可以讓AI寫個程序一直response ok就好了。至此ping的部分就做好了。

這給了我一部分和AI繼續合作的信心。因為考慮到后續python的運行速度可能會比較慢,所以又讓AI把之前的代碼用golang寫了一遍。很不錯,各個部分都是一次性編譯通過并且運行無誤。

之后就進入udp處理的部分了。這個部分主要是先支持ping www.csdn.net,因為上面的最初版本,里面會判斷如果是icmp ping,再判斷是內部網絡還是外部網絡ip,就能走通ping,其他的ip packet還是unreachable host,所以ping www.csdn.net會告訴我domain name暫時不可用,打出的ip packet第一個也是一個dns query的udp packet。relay吧,udp packet發送過來,然后slirp維護一個map,并和對應net.UDPConn通信就好了。從udp packet里拿到payload,拿到服務器的ip和port,發送payload,拿到response,拼接一個合適的ip packet發送回去,通路成功!這下ping一個域名也可以了。我出要求,AI寫代碼,我負責integration整合并且debug…還算順利。

之后有一個難題就是udp是無狀態的,那我在map里的connection什么時候釋放呢?之后想了個簡單策略,如果30s沒有通信,直接timeout釋放掉,之后它發送數據再創建連接好了。至于udp server如何處理,暫時不慌,以后再說吧。

接下來就是處理tcp了。這個時候也是gpt5剛出來的時候,讓它寫了點代碼,真的是牛頭不對馬嘴,算了,還是繼續claude4+gemini吧…這個時候代碼已經有個600多行了,在免費的高級模型里,已經不能讀代碼然后改了。沒關系,我們直接讓它寫一個處理tcp的ip packet,然后再寫一個程序處理tcp payload的讀寫,把兩個程序代碼拼一起就完成了最基本的。

這個時候把claude4的代碼貼進去,運行,然后curl http://bing.com,看到log已經顯示連接到bing的ip,并且發送了http request,只是curl一直報錯 http/0.9 not allow之類,傻眼了。把代碼片段貼給倆AI模型,然后告訴我了幾個錯誤的bug…這下抓瞎了…只能看看curl的源代碼哪里報這個錯,但是看代碼還是要花不少時間…

這個時候正好是gpt5出了gpt5-high和gpt5-chat不同版本的時候,那就試試gpt5-high吧,把處理tcp的部分直接貼給它,它直接指出了錯誤,給口碑崩塌的gpt5挽回了一些顏面…原來是處理SYN SYN-ACK ACK的時候SeqNum忘了加一!不錯,AI對有效context內代碼的理解已經很給力了。

寫到這里,slirp.go已經在沒有第三方庫的情況下1000多行能夠處理簡單curl http://some-index-server了,比如準備好一個寫了world的hello文件放nginx上,curl一下會返回world。之后接著就要考慮如何給超過MTU的tcp分片傳輸了…先休息下,等完成了放代碼出來…

(未完待續)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93500.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93500.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93500.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國標:開展環境衛生滿意度調查

隨著社會的進步和人們生活水平的提高,(滿意度調查)(問卷調查)(第三方市場咨詢公司)對生活品質的追求以及對環境保護的重視已經成為了當下社會的主旋律。在這樣的背景下,環境衛生問題…

【辦公類-54-08】20250902 2025學年第一學期班級點名冊模版(雙休國定假涂成灰色、修改標題和頁眉,批量導出PDF)根據新Excel模版,標題增加園區、空姓名行填充灰色

背景需求: 之前做了優化過的點名冊 【辦公類-54-07】20250901 2025學年第一學期班級點名冊模版(雙休國定假涂成灰色、修改標題和頁眉,批量導出PDF)-CSDN博客文章瀏覽閱讀984次,點贊27次,收藏29次。【辦公類-54-07】20250901 202學年第一學期班級點名冊模版(雙休國定假…

【C++知識雜記1】智能指針及其分類

智能指針(smart pointer) 是 C11 引入的一類 模板類,用來封裝原始指針,自動管理堆內存的生命周期,避免出現 內存泄漏 和 懸空指針(野指針) 的問題。 當智能指針對象離開作用域時,它會…

vue從入門到精通:搭建第一個vue項目

目錄 Vue是什么 一、nodejs安裝 二、安裝Vue CLI 三、創建Vue項目 四、配置vue.config.js文件 五、創建第一個應用hello word Vue是什么 Vue是一款?用于構建用戶界面的 JavaScript 漸進式架構?既可作為庫(僅關注視圖層)也可擴展為框架,支持從靜態頁面到復雜單頁應用…

C# Queue源碼分析

Queue<T> 是 .NET 中實現隊列&#xff08;先進先出&#xff09;的一種泛型集合類。它基于數組實現&#xff0c;支持動態擴容、線程不安全&#xff0c;適用于大多數需要隊列結構的場景。一、類結構與字段說明 public class Queue<T> : IEnumerable<T>, IColle…

微服務之注冊中心與ShardingSphere關于分庫分表的那些事

小伙伴們&#xff0c;你們好呀&#xff01;我是老寇&#xff01;跟我一起學習注冊中心與ShardingSphere怎么一起使用 使用 nacos-shardingsphere例子&#xff0c;請點擊我 注意&#xff1a;需要自己提前創建數據庫和表 create database kcloud_platform_test;DROP TABLE IF…

python遇到異常流程

在 Python 中&#xff0c;程序遇到異常時的退出行為取決于是否對異常進行了捕獲和處理&#xff1a;未捕獲的異常&#xff1a; 如果異常發生后沒有被 try-except 語句捕獲&#xff0c;程序會立即終止&#xff0c;并返回一個非零的退出碼&#xff08;通常是 1&#xff09;&#x…

【開源大模型和閉源大模型分別有哪些?兩者的對比?部署私有化模型的必要性有哪些?】

以下是關于開源與閉源大模型的詳細對比及私有化部署必要性的分析&#xff0c;結合最新行業動態和技術趨勢&#xff1a;一、開源 vs 閉源大模型代表列表 1. 開源大模型&#xff08;2024年主流&#xff09;模型名稱參數量機構特點LLaMA-38B-70BMeta商業使用需授權&#xff0c;多語…

SpringBoot--JWT

一、JWT 的簡單了解1. 什么是 JWT&#xff1f;JWT&#xff08;JSON Web Token&#xff09;是一種開放標準&#xff08;RFC 7519&#xff09;&#xff0c;用于在 各方之間安全地傳輸信息。它基于 JSON 格式&#xff0c;信息通過 數字簽名 的方式保證不可篡改&#xff0c;常用于 …

OpenTelemetry、Jaeger 與 Zipkin:分布式鏈路追蹤方案對比與實踐

OpenTelemetry、Jaeger 與 Zipkin&#xff1a;分布式鏈路追蹤方案對比與實踐 問題背景介紹 隨著微服務架構的普及&#xff0c;服務之間調用鏈路變得異常復雜&#xff0c;單一服務故障或性能瓶頸往往牽一發動全身。分布式鏈路追蹤&#xff08;Distributed Tracing&#xff09;能…

云原生俱樂部-RH124知識點總結(1)

RH124內容不是很多&#xff0c;但是也不知道多少能夠寫完&#xff0c;細節性的東西不會太多&#xff0c;但是確保每個都能夠有印象能理解。本來是打算一篇文章寫完的&#xff0c;但最后還是決定寫一個系列。至于RH124和RH134的內容為什么放在了k8s系列的后面&#xff0c;那只是…

Redis面試精講 Day 25:Redis實現分布式Session與購物車

【Redis面試精講 Day 25】Redis實現分布式Session與購物車 在高并發、多節點的現代Web應用架構中&#xff0c;傳統的本地Session存儲方式已無法滿足分布式系統的需求。如何實現跨服務、高可用、低延遲的用戶狀態管理&#xff0c;成為后端開發和面試中的高頻考點。今天是“Redi…

本地文件上傳到gitee倉庫的詳細步驟

本地文件上傳到gitee倉庫的詳細步驟 &#x1f530; 一、前期準備 注冊 Gitee 賬號 訪問 Gitee 官網完成注冊并登錄。 網址&#xff1a;https://gitee.com/ 安裝 Git 下載 Git 官方客戶端并完成安裝。 下載網址&#xff1a;https://git-scm.com/downloads 配置 Git 全局信息&…

7 索引的監控

1. 查看索引的監控狀態 GET /_cat/indices/log2?v&formatjson[{"health" : "yellow","status" : "open","index" : "log2","uuid" : "1OnzbVbJRn2grc5k198LlA","pri" : "…

【秋招筆試】2025.08.10米哈游秋招機考真題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍在線刷題 bishipass.com 米哈游 題目一:圖書館整理計劃 1??:貪心策略從左到右固定每個位置的最優元素 2??:使用線段樹維護區間最小值信息,支持單點更新和區間查詢 3??:每次選…

恒創科技:日本服務器 ping 不通?從排查到解決的實用指南

玩游戲、做跨境業務時&#xff0c;突然發現日本服務器 ping 不通&#xff0c;簡直能讓人瞬間焦慮 —— 這到底是網絡崩了&#xff0c;還是服務器出問題了?在本文中&#xff0c;我們將探討如何排除日本服務器 ping 請求故障&#xff0c;附帶常見原因及解決辦法。先搞清楚&#…

ThinkPHP的Controller獲取request對象的幾種方式

文章目錄環境在Controller中獲取Request對象構造器注入操作方法注入繼承BaseController助手函數Facade參考環境 Windows 11 專業版XAMPP 8.2.12 PHP 8.2.12VSCode 1.103.0 在Controller中獲取Request對象 要想在Controller中獲取Request對象&#xff0c;有以下幾種方式&…

week2-[循環結構]找出正數

week2-[循環結構]找出正數 題目描述 給定 NNN 個整數A1,A2,…,ANA_1,A_2,\ldots,A_NA1?,A2?,…,AN?。請求出這 NNN 個數中有多少個數是正數&#xff0c;并求出這些正數的平均值。如果 A1,A2,…,ANA_1,A_2,\ldots,A_NA1?,A2?,…,AN? 不存在正數&#xff0c;那么輸出 “Non…

Android平臺RTSP播放器選型指南:從開源方案到跨平臺低延遲專業SDK

1. 引言&#xff1a;Android RTSP 播放的三條路徑 在 Android 平臺實現 RTSP 播放&#xff0c;看似只是“能播起來”的問題&#xff0c;實際上是一個涉及延遲、穩定性、解碼性能、協議兼容、工程可控性等多維指標的綜合選型問題。 從安防監控、教育互動&#xff0c;到單兵指揮…

Linux安裝及遠程連接知識實踐

文章目錄一、VMware創建虛擬機故障及解決匯總1. 鏡像下載2. 鏡像選擇安裝3.安裝VMware遇到的相關問題4. VMware操作系統的安裝4.1 選擇系統的引導4.2 修改網卡名為eth0的形式(和CentOS7以前保持一致)4.3 進入下一步安裝界面4.4 進入到安裝摘要頁面(INSTALLATION SUMMARY)4.5 配…