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。