html - 如何在 Windows 中使用 C 提交表单
问题描述
我正在尝试以 html 形式实现一个简单的 Web 服务器。它必须是 C 语言和 Windows 用户。
/* FOR SERVER */
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <io.h>
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#include <windows.h>
short SocketCreate(void)
{
short hSocket;
printf("Create the socket\n");
hSocket = socket(AF_INET, SOCK_STREAM, 0);
return hSocket;
}
int BindCreatedSocket(int hSocket)
{
int iRetval = -1;
int ClientPort = 8888;
struct sockaddr_in remote = { 0 };
/* Internet address family */
remote.sin_family = AF_INET;
/* Any incoming interface */
remote.sin_addr.s_addr = htonl(INADDR_ANY);
remote.sin_port = htons(ClientPort); /* Local port */
iRetval = bind(hSocket, (struct sockaddr *)&remote, sizeof(remote));
return iRetval;
}
int main(int argc, char *argv[])
{
WSADATA wsa;
int socket_desc, sock, clientLen;
struct sockaddr_in client;
char clienttan_gelen_message[200] = { 0 };
char serverResponse[500] = { 0 };
char response404[50] = { 0 };
char serverResponseXmlData[] = "<body><h1>Simple Calculator</h1><br><name>Can</name><age>26</age></body>";
char serverResponseXmlData2[] = "<form action = localhost:8888>"
"<div><label>Multiplicand 1: <input name = \"m\" size = \"5\"></label></div>"
"<div><label>Multiplicand 2: <input name = \"n\" size = \"5\"></label></div>"
"<div><input type = \"submit\" value = \"Multiply!\">< / div>"
"< / form>";
char message[100] = { 0 };
const char *pMessage = "hello";
printf("Initialising winsock...\n");
// The WSAStartup function is used to start or initialise winsock library.
// It takes 2 parameters ; the first one is the version we want to load and
// second one is a WSADATA structure which will hold additional information after winsock has been loaded.
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) // wsa will hold additional info after winsock has been loaded.
{
printf("Failed. Error Code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");
//Create socket
socket_desc = SocketCreate();
if (socket_desc == -1)
{
printf("Could not create socket");
return 1;
}
printf("Socket created\n");
//Bind
if (BindCreatedSocket(socket_desc) < 0)
{
//print the error message
perror("bind failed.");
return 1;
}
printf("bind done\n");
//Listen
listen(socket_desc, 3);
//Accept and incoming connection
while (1)
{
printf("Waiting for incoming connections...\n");
clientLen = sizeof(struct sockaddr_in);
//accept connection from an incoming client
sock = accept(socket_desc, (struct sockaddr *)&client, (int *)&clientLen);
if (sock < 0)
{
perror("accept failed");
return 1;
}
printf("Connection accepted\n");
memset(clienttan_gelen_message, '\0', sizeof clienttan_gelen_message);
memset(message, '\0', sizeof message);
//Receive a reply from the client
if (recv(sock, clienttan_gelen_message, 200, 0) < 0)
{
printf("recv failed");
break;
}
printf("Clienttan gelen mesaj: %s\n\n\n", clienttan_gelen_message);
// Send some data
//sprintf(serverResponse, "HTTP/1.0 200 OK\r\n\r\n%s\r\n", serverResponseXmlData);
sprintf(serverResponse, "HTTP/1.0 200 OK\r\n\r\n%s\r\n", serverResponseXmlData2);
if (send(sock, serverResponse, strlen(serverResponse), 0) < 0)
{
printf("Send failed");
sprintf(response404, "HTTP/1.0 404 Not Found\r\n");
send(sock, response404, strlen(response404), 0);
return 1;
}
//closesocket(sock);
Sleep(1000); // Note uppercase 'S'
}
closesocket(sock);
WSACleanup();
return 0;
}
我设法只是向浏览器发送了一个简单的文本,但不知道如何发送表单以便在浏览器端填写它。我在互联网上的研究没有产生任何结果。
任何人都可以帮我解决这个问题吗?
解决方案
要处理 HTML 表单,服务器需要处理通过使用的 GET 或 POST 方法提交的表单数据。
但是,您可能需要考虑一个已经实现所有这些的库,而不是从头开始。这个适用于 Windows 并具有 LGPL 许可证:http ://www.gnu.org/software/libmicrohttpd/
推荐阅读
- css - 如何将 TextMeshPro-StyleTags 转换为 Unity 中的实际 RichText?
- android - ViewModel、LiveData 出现问题
- discord.js - 如何在命令后控制台记录消息的第二部分
- twilio - 如何在呼叫任何人之前创建 Twilio 会议?
- html - 我使用 Css 不同的易用性创建淡入和淡出效果,但是
- python - Django过滤一个预取的查询集,返回一个空列表
- r - tidyverse 按列连接两个具有动态列名的数据集
- batch-file - 是否可以在 BAT 文件中加密/散列密码?
- angular - 安装@angular/material 时无法解析依赖树
- python - 检查城市名称是否属于给定国家的最简单方法是什么?