脚本语言如何使用套接字?

1 投票
4 回答
826 浏览
提问于 2025-04-15 14:20

Python、Perl 和 PHP 都支持 TCP 流套接字。但是,如果我只有 FTP 访问权限,而没有机器的根权限,我该如何在由网络服务器(比如 Apache)运行的脚本文件中使用套接字呢?

  1. 当客户端连接到特定端口时,脚本文件是如何被调用的?

  2. 脚本在连接期间会一直“运行”吗?(可能会持续几个小时)

  3. 那么会有多个“实例”的脚本同时运行吗?

  4. 那么,如何从一个脚本实例调用另一个实例的方法呢?

4 个回答

1

我能理解你问的问题,前提是你使用了 inetd 或者类似的服务管理程序。这个程序的作用是为特定的监听端口启动你的“单客户端服务”程序,并把这个程序的输入输出转发给远程客户端。

如果是这样的话:

1) inetd 会运行这个程序

2) 是的

3) 是的

4) 命名管道 是一种可能的解决方案

2

之前的回答提到,脚本语言在这方面的工作方式和编译程序是一样的。它们的不同之处可能在于使用的API。操作系统(比如Windows或Unix)提供了一种API(例如,BSD套接字),编译程序通常会直接调用这个API。而像PHP或Python这样的解释型语言可能会提供不同的API,比如Python的套接字API,这可能会简化一些底层API的使用。

使用这些API时,处理一个进来的TCP连接的方式有很多种。关于这些方法的详细概述可以在c10k网页上找到:http://www.kegel.com/c10k.html,特别是关于IO策略的部分。简单来说,选择如何处理连接的问题取决于程序员,这可能会影响程序在高负载下的表现。

针对你的具体问题:

  1. 很多服务器程序是在连接之前就启动的,它们会一直运行,监听进来的连接。一个特殊的例子是inetd,它是一个超级服务器:它监听连接,然后把这些连接交给它启动的程序(在配置文件中指定)。
  2. 通常情况下,是的,脚本会在连接期间一直运行。不过,根据更大的系统架构,脚本也可能会把连接交给另一个程序处理,然后退出。
  3. 这也是一个选择,具体可以参考c10k页面上的内容。
  4. 这又是一个选择;操作系统为程序提供了多种进程间通信(IPC)机制。
6

脚本语言和编译语言在使用套接字(socket)方面是一样的。

1) 脚本通常会打开并使用套接字。套接字并不是“运行”或“调用”脚本,而是脚本通过一些库直接控制它(通常是调用操作系统的C语言接口)。

2) 是的。

3) 不一定。大多数现代脚本语言可以在一个“脚本”应用中处理多个套接字。

4) 不适用,见第3点。


根据问题和评论的变化进行编辑:

现在很明显,你是在一个托管服务器的环境中运行这个。通常,如果你在Apache或类似的服务器中使用脚本,事情会稍微不同。套接字是由Apache打开和维护的,它会执行你的脚本,并将相关数据(比如POST/GET的结果等)传递给你的脚本进行处理。当你处理CGI等脚本时,通常不会涉及套接字。

不过,这通常是使用与mod_cgi相同的概念进行的。这基本上意味着,从服务器的角度来看,运行的脚本只不过是一个可执行文件,而可执行文件的输出就是返回给客户端的内容。在这种情况下(前提是你在服务器上有权限和正确的库),你的Python脚本实际上可以启动一个独立的脚本,完全在Apache的上下文之外进行套接字工作。

不过,通常不建议在CGI脚本中直接运行完整的套接字实现。CGI会期望可执行文件在返回结果给客户端之前完成运行。Apache会在那里“挂起”一段时间,等待这个过程完成。如果你启动了一个完整的服务器(尤其是如果它是一个长时间运行的进程,通常都是这样),Apache会认为脚本被锁住了,可能会中止这个进程(具体配置不同,但大多数托管公司这样做是为了防止脚本在共享系统上占用过多CPU)。

但是,如果你在脚本中执行一个新的脚本,然后返回(关闭CGI可执行文件),另一个脚本可以继续运行,作为一个服务器工作。这就像是(Python示例,使用subprocess库):

newProccess = Popen("python MyScript", shell=True)

请注意,上述内容实际上很大程度上依赖于服务器的配置。许多托管公司在其脚本实现中不包含某些套接字或shell库,特别是为了防止这种情况,因此你通常需要退回到用C语言编写可执行文件。此外,这通常违反了大多数托管公司的服务条款——你需要检查一下你的托管公司。

撰写回答