, -. stdin . close(new_socket);:
char c;
while ((c = getchar()) != EOF) {
write(new_socket, &c, 1);
}
, , fflush(stdout), printf, bash script, malloc SO_REUSEADDR , (. ).
#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>
#define BUFSIZE 1024
int main()
{
int create_socket, new_socket;
socklen_t addrlen;
char buffer[BUFSIZE];
struct sockaddr_in address;
char c;
int true = 1;
if ((create_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("server: socket");
exit(1);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(1600);
setsockopt(create_socket,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int));
if (bind(create_socket, (struct sockaddr *)&address, sizeof(address)) < 0)
{
perror("server: bind");
exit(1);
}
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 (recv(new_socket, buffer, BUFSIZE, 0) < 0)
{
perror("server: recv");
exit(1);
}
printf("%s", buffer);
fflush(stdout);
while ((c = getchar()) != EOF)
{
if (write(new_socket, &c, 1) < 0)
{
perror("server: write");
exit(1);
}
}
close(new_socket);
close(create_socket);
return 0;
}
bash script. , , GET.
#!/bin/bash
rm -f out
mkfifo out
trap "rm -f out" EXIT
cat out | ./a.out > >(
while read line
do
line=$(echo $line | tr -d '\r')
echo $line
if [[ $line == "" ]]; then
break
fi
done
printf "HTTP/1.1 200 OK\nContent-Type:text/html\n\ntest" > out
)
nc, , (-l) 1600.