(关于我对防火墙规则的看法,见最后)
该功能似乎根本不存在。
socket
在 C 中,您使用,bind
和调用创建服务器套接字,并listen
通过调用获取传入连接accept
。src\modules\internet\sock.c 是套接字处理程序代码,它有两个打开套接字的函数,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;
}
它绑定并侦听 INADDR_ANY,这意味着您 PC 的所有接口(不仅仅是环回),它肯定会触发防火墙。
该函数是从相邻的 Rsock.c 调用的,仍然使用一个端口参数,并且在 sockconn.c 中丢失其他所有内容的地方似乎要早一步:
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”来限制规则,但块部分是肯定的。