2010-06-02 18 views
0

我在使用WinSock API實現SMTP協議時遇到問題。這是我現在所做的。客戶端創建一個非阻塞套接字,連接到服務器並與其交換數據。在將數據發送到SMTP服務器時,是否必須偵聽服務器輸出?

它使用「發送字符串」原始直到整個串的傳輸,並在環路efectively稱send()「收到字符串」基元直到CRLF結尾的字符串積累或超時發生在一個循環中調用recv()

除了在客戶站點部署的特定服務器之外,上述笨拙方法起作用。在這臺服務器上,客戶端發送EHLO,AUTH,MAIL FROM,RCPT,DATA,每次都收到合理的迴應。然後,它逐行發送郵件消息體(不試圖從服務器接收任何內容),並在一段時間後發送send()(發送幾百行)星星返回WSAEWOULDBLOCK

我該如何處理?每行後都必須檢查套接字上的未決輸入嗎?或者我還應該做些什麼來預測並可能預防這種情況?

+0

你看過正在發送的郵件嗎(在接收端)? WSAEWOULDBLOCK是一個非致命錯誤。這可能就像在錯誤發生後重新嘗試同一行一樣簡單。 – 2010-06-02 12:39:49

+0

你有沒有考慮讓MS爲你做這項工作?使用CDO或MAPI或其他人之一? – bmargulies 2010-06-02 12:43:21

+0

@Justin Niessner:我們在循環中重試,直到經過一段很長的時間或實際發送數據。 – sharptooth 2010-06-02 12:44:44

回答

0

documentation

是從無法立即完成非阻塞套接字的操作返回此錯誤,例如recv的時候沒有數據排隊從套接字讀取。這是一個非致命錯誤,操作應該稍後重試。