2013-08-23 20 views
2

我正在運行使用TCP套接字的網絡程序的測試。要驗證錯誤修復,我需要在套接字層重現一個「Broken pipe」錯誤,但我不知道如何。任何想法?非常感謝。如何注入「破管」錯誤?

回答

2

「斷開的管道」表示您已寫入已由對等關閉的連接。所以,讓同伴關閉連接。

+0

是的,理論上。在我的代碼中,我嘗試通過close(),exit()甚至「ctrl-C」退出接收器。沒有任何東西會使發件人打印「Broken pipe」錯誤。 – user180574

+1

發送更多。沒人說這是瞬間的。例如,由於TCP緩衝,在破壞之後的第一次發送中不會發生。此外,發件人不一定會打印任何內容,除非它被編程爲在每次發送()錯誤時都這樣做。 – EJP

+0

是的,我發送大量數據並放慢了網絡傳輸過程中終止接收器。謝謝。 – user180574

0

一個「Broken pipe」錯誤消息通常來自shell,因爲它檢測到它創建的子由於SIGPIPE信號而退出。所以你可以通過SIGPIPE殺死一個孩子(kill -PIPE %1殺死第一個後臺命令)手動導致一個。

SIGPIPE由內核生成併發送到任何進程,在另一端關閉後嘗試寫入管道或套接字。

+0

我的代碼檢查 「發送()」 的返回值,並且使用「perror()」打印錯誤。如果它是一個真正的「破碎的管道」,perror將打印出來。但是對於你的方法,程序退出而不打印任何錯誤。 – user180574

+0

然後你在某個地方缺少測試,或者程序已經發送了大部分數據。 – EJP

1

我環顧四周,無法找到任何地方記錄的程序,所以在這裏你去。

我在我的ssh配置中找到了一個使用'nc'proxy命令的服務器。

主機服務器

ProxyCommand的/ usr/bin中/ NC -4 -n -X 5 -X 127.0.0.1:55555%H%P

我跑的SSH與ServerAlive選項設置爲1:

> SSH -o ServerAliveInterval = 1 -o ServerAliveCountMax = 1 e3prosup @服務器

然後在另一個會話中,我發現與ssh關聯的'nc'進程並將其殺死。 kill -9(SIGKILL)或kill -13(SIGPIPE)都可以工作。

> PS -efa

e3prosup 19502 10955 0 11時43分/ 6 00:00:00 SSH -o ServerAliveInterval = 1 -o ServerAliveCountMax = 1 e3prosup @服務器

e3prosup 19503 19502 0 11點43分/ 6 00:00:00的/ usr/bin中/ NC -4 -n -X 5 -X 127.0.0.1:55555服務器22

>殺-13 19503

現在SSH會話獲取:

e3prosup @服務器>寫失敗:斷的管