(ファイアウォール ルールに関する私の見解については、一番最後を参照してください)
機能は単に存在しないようです。
C では、 と の呼び出しでサーバー ソケットを作成しsocket
、bind
呼び出しlisten
で着信接続を取得しaccept
ます。src\modules\internet\sock.c はソケット ハンドラー コードで、ソケットを開くための 2 つの関数があり、ソケットをSock_connect
開いて接続するため、これはクライアント側用でありint Sock_open(Sock_port_t port, Sock_error_t perr)
、サーバー ソケット (および実際の受け入れコールは にありますSock_listen
)。問題は、これSock_open
にはport
引数しかなく、ホスト/インターフェースがハードコードされていることです:
/* open a socket for listening */
int Sock_open(Sock_port_t port, Sock_error_t perr)
{
int sock;
struct sockaddr_in server;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return Sock_error(perr, errno, 0);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons((short)port);
if ((bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) ||
(listen(sock, MAXBACKLOG) < 0)) {
close(sock);
return Sock_error(perr, errno, 0);
}
return sock;
}
これは、PC のすべてのインターフェイス (ループバックだけでなく) を意味する INADDR_ANY にバインドしてリッスンし、ファイアウォールを確実にトリガーします。
この関数は、隣接する Rsock.c から呼び出されますが、ポート引数は 1 つだけです。他のすべてが失われる場所は、sockconn.c の 1 ステップ前のようです。
static Rboolean sock_open(Rconnection con)
{
Rsockconn this = (Rsockconn)con->private;
int sock, sock1, mlen;
int timeout = this->timeout;
char buf[256];
if(timeout == NA_INTEGER || timeout <= 0) timeout = 60;
this->pend = this->pstart = this->inbuf;
if(this->server) {
sock1 = R_SockOpen(this->port);
この最後の行は、RSockconn のホスト部分が無視される場所ですが、そのようなフィールドが含まれています。
/* used in internet module */
typedef struct sockconn {
int port;
int server;
int fd;
int timeout;
char *host;
char inbuf[4096], *pstart, *pend;
} *Rsockconn;
(これは外部の src\include\Rconnections.h で定義されています)
残念ながら、これで問題が解決するわけではありません。これが問題を抱えている理由です。R の開発者にエラー レポートを提出することを検討してください。コメントは、ファイアウォールやインターネット セキュリティが現在のようにそれほど重要ではなかった古代からネット コードを入手したことを示唆しています。
/* Simple sockets interface derived from the sockets UICI
implementation in Appendix B of Practical UNIX Programming,
K. A. Robbins and S. Robbins, Prentice Hall, 1996. */
21年前の話です。
もともと私は他の人から netsh を盗むつもりはありませんでしたが、間違った提案を受ける可能性があると思います。実際には、何も許可してはいけませんが、すべてをブロックしてください:
netsh advfirewall firewall add rule name="Rtest" dir=in action=block program="<location and name of your executable>"
それだけです。問題は、ループバック インターフェイスがまったくファイアウォールで保護されていないことです (したがって、127.0.0.1 への接続は常に機能します。安全のために、私もテストしました)。他の回答で「許可」を見ましたが、それは望ましくありません。他の用途によっては、「localport=8」や「protocol=tcp」でルールを制限する必要があるかもしれませんが、ブロック部分は確実です。