我正在尝试使用C和Bash创建一个用于Web服务器目的的Netcat副本。以下是我的Bash代码:
当我访问localhost:1500时,会打印出“test”。我想用自己的替换netcat(nc)。
这是customnc.c文件。
我的代码有什么问题?当我访问localhost:1600(customnc)时,它只会抛出一个“无法连接”的错误。
问题在于从bash发送数据。如果我使用
编辑:真正的问题是我想在bash中解析http请求并使用bash将文件发送到c。所以它的流程如下: 1. Bash启动c服务器 2. 用户在浏览器中打开localhost 3. C将获取请求并将其发送回bash 4. Bash将解析请求并将响应(文本)发送到c 5. C将接收响应并通过套接字将其发送到浏览器 6. C将关闭套接字
我正在尝试实现这个过程,但我无法进行双向通信。我可以使用命名管道(2)吗?
#!/bin/bash
rm -f out
mkfifo out
trap "rm -f out" EXIT
cat out | nc -l 1500 > >(
while read line
do
echo $line
# parse http request from line
# some other things that doesnt matter
printf "HTTP/1.1 200 OK\nContent-Type:text/html\n\ntest" > out
done
)
当我访问localhost:1500时,会打印出“test”。我想用自己的替换netcat(nc)。
cat out | customnc -l 1500 > >(
#
)
这是customnc.c文件。
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
int main() {
int create_socket, new_socket;
socklen_t addrlen;
int bufsize = 1024;
char *buffer = malloc(bufsize);
struct sockaddr_in address;
if ((create_socket = socket(AF_INET, SOCK_STREAM, 0)) > 0){
printf("The socket was created\n");
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(1600);
if (bind(create_socket, (struct sockaddr *) &address, sizeof(address)) == 0){
printf("Binding Socket\n");
}
if (listen(create_socket, 10) < 0) {
perror("server: listen");
exit(1);
}
if ((new_socket = accept(create_socket, (struct sockaddr *) &address, &addrlen)) < 0) {
perror("server: accept");
exit(1);
}
if (new_socket > 0){
printf("The Client is connected...\n");
}
recv(new_socket, buffer, bufsize, 0);
printf("%s", buffer);
close(new_socket);
close(create_socket);
return 0;
}
我的代码有什么问题?当我访问localhost:1600(customnc)时,它只会抛出一个“无法连接”的错误。
问题在于从bash发送数据。如果我使用
write
在customnc.c中发送响应,浏览器将显示消息,但我必须从bash发送它。编辑:真正的问题是我想在bash中解析http请求并使用bash将文件发送到c。所以它的流程如下: 1. Bash启动c服务器 2. 用户在浏览器中打开localhost 3. C将获取请求并将其发送回bash 4. Bash将解析请求并将响应(文本)发送到c 5. C将接收响应并通过套接字将其发送到浏览器 6. C将关闭套接字
我正在尝试实现这个过程,但我无法进行双向通信。我可以使用命名管道(2)吗?
while read line
循环会一直等待nc
终止。 - Timout
先进先出管道 一次,因为当cat out
读取到 EOF 时将终止。 - Tim