CGI(Common Gateway Interface)是一种标准,允许Web服务器与外部程序交互,从而动态生成网页内容。在C语言中编写CGI程序可以实现更底层的控制和更高的性能。在这个场景中,CGI程序通过Socket通信与服务器进行数据交换。
让我们详细了解一下服务器端的代码。服务器端的核心是`sock()`函数,它创建了一个监听套接字并等待客户端连接。以下是对关键步骤的解释:
1. `socket()`函数用于创建一个新的套接字。`AF_INET`表示使用IPv4协议,`SOCK_STREAM`指定使用TCP协议,而0参数则表示使用默认的协议族。
2. `bind()`函数将套接字与特定的IP地址和端口(7777)关联起来。在这里,`INADDR_ANY`表示服务器监听所有可用的网络接口。
3. `listen()`函数设置套接字为监听模式,允许最多20个连接请求排队等待处理。
4. `accept()`函数接收来自客户端的连接请求,并返回一个新套接字`temp_sock_fp`,用于与该客户端进行通信。
5. `recv()`函数从客户端接收数据,将其存储在`buff`缓冲区中。
6. `webdeal()`函数对收到的数据进行处理,具体实现未给出,可能是解析HTTP请求或执行其他业务逻辑。
7. `send()`函数将处理后的响应发送回客户端,这里使用了`msg`变量中的"hello internet!"字符串。
8. 关闭与客户端的连接,准备接受下一个连接。
客户端的代码主要在`cgiMain()`函数中调用`Sock()`函数来完成与服务器的通信。下面是客户端的关键步骤:
1. `gethostbyname()`函数用于获取服务器的IP地址信息,这里的`host_name`是服务器的IP地址。
2. 创建一个`sockaddr_in`结构体`pin`,设置其`sin_family`为`AF_INET`,`sin_port`为端口号7777,并通过`htonl()`和`htons()`函数转换地址和端口到网络字节序。
3. `socket()`函数创建一个套接字,与服务器端类似。
4. `connect()`函数尝试连接到服务器的指定IP和端口。如果连接成功,继续发送数据。
5. `send()`函数向服务器发送消息,这里是"ok,socket!"字符串。
6. `recv()`函数接收服务器的响应,然后打印出来。
这个例子展示了如何用C++编写一个简单的CGI程序,通过Socket与Web服务器进行通信。服务器端作为服务提供者,接收并处理来自客户端的请求,而客户端则负责发起请求并接收响应。这种通信方式广泛应用于Web应用程序中,特别是在需要动态生成内容或与数据库交互时。