【发布时间】:2017-05-14 20:00:14
【问题描述】:
在 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。
【问题讨论】: