В расширении 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
=> Всегда будет возвращать 0, даже если данные были отправлены другим концом соединения TCP.