0
在雷鳥擴展我用下面的代碼來等待進入的TCP連接:在Thunderbird擴展中製作雙向TCP套接字?
function MyExtension_OnNewConnection(srvSock, newSock)
{
var block = Components.interfaces.nsITransport.OPEN_BLOCKING |
Components.interfaces.nsITransport.OPEN_UNBUFFERED;
var istream = newSock.openInputStream(block, 0, 0);
var ostream = newSock.openOutputStream(block, 0, 0);
var cstream = Components.
classes["@mozilla.org/scriptableinputstream;1"].
createInstance(Components.interfaces.nsIScriptableInputStream);
cstream.init(istream);
var y = cstream.read(1);
cstream.close();
if(y == "")
{
var y = "The socket is Tx-Only!\r\n";
ostream.write(y, y.length);
}
istream.close();
ostream.close();
}
...
waitSocket = Components.classes["@mozilla.org/network/server-socket;1"].
createInstance(Components.interfaces.nsIServerSocket);
waitSocket.init(-1, false, -1);
waitSocket.asyncListen({
onSocketAccepted: MyExtension_OnNewConnection,
onStopListening: function(socket, status) {}
});
根據文檔cstream.read()
當TCP套接字關閉只能返回一個空字符串。
ostream.write()
函數將發送一些數據,但只有在TCP套接字未關閉的情況下才可能發送。
但是cstream.read()
返回一個空字符串,ostream.write()
發送一些數據,TCP連接的另一端接收到字符串!
這意味着TCP連接是單向(從一開始!)。
問題:
- 爲什麼?
- 如何才能使TCP連接成雙向的,以便我可以接收數據?
我已經嘗試過:
- 不使用
OPEN_BLOCKING
也不OPEN_UNBUFFERED
標誌=>無影響。 - 在循環中檢查
istream.available()
而不是使用cstream
=>即使數據已由TCP連接的另一端發送,也將始終返回0。