2017-02-18 2 views
1

Проблема:C-сервер: Ncat: сброс соединения одноранговой

Вскоре, как добавить эти две строки на мой сервер ..

fff = popen(ccc, "r"); 
pclose(fff); 

Я получаю это «сброс соединения пэром», когда тестируя его через netcat.

echo test | nc <ip> <port> 
    <response> 
Ncat: Connection reset by peer. 

без этих 2-х линий ..

echo test | nc <ip> <port> 
    <response> 

гладкой. без проблем.

Какое правильное решение?

ПОЛНЫЙ КОД:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <err.h> 
#include <string.h> 


FILE * fff; 
char * ooo = "HTTP/1.1 200 OK\r\n\r\n aa \r\n"; 
char * ppp = "/10/web"; 
char iip [15]; 


int main() 
{ 
    int one = 1, client_fd; 
    struct sockaddr_in svr_addr, cli_addr; 
    socklen_t sin_len = sizeof(cli_addr); 

    int sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock < 0) 
    err(1, "can't open socket"); 

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)); 

    int port = 50; 
    svr_addr.sin_family = AF_INET; 
    svr_addr.sin_addr.s_addr = INADDR_ANY; 
    svr_addr.sin_port = htons(port); 

    if (bind(sock, (struct sockaddr *) &svr_addr, sizeof(svr_addr)) == -1) { 
    close(sock); 
    err(1, "Can't bind"); 
    } 

    listen(sock, 5); 
    while (1) { 
    client_fd = accept(sock, (struct sockaddr *) &cli_addr, &sin_len); 
    snprintf(iip, 15, "%s", inet_ntoa(cli_addr.sin_addr)); 

    char * ccc; 
    asprintf(&ccc, "%s %s", ppp, iip); 
    fff = popen(ccc, "r"); 
    pclose(fff); 

    printf(ccc); 
    printf("\n"); 
    printf("connection.. \n"); 

    write(client_fd, ooo, strlen(ooo)); 
    close(client_fd); 
    } 
} 

упаковывают это имеет значение .. это файл (/ 10/веб)

#!/bin/sh 
printf 'test'; 
echo 'uuuuuu'; 
+0

Я предлагаю вам проверить, если 'popen' действительно преуспевает, и' fff' не является нулевым указателем. –

+0

Кроме того, проверьте (из оболочки), что вы на самом деле * можете * выполнить '/ 10/web'. –

+0

@ Какой-то программист-чувак, как я могу его проверить? –

ответ

0

"Подключение сброса" означает, что сервер закрыл соединение без прочитав данные, отправленные клиентом. Учитывая, что вы не читаете с client_fd, это то, что вы должны ожидать. Чтобы исправить ошибку, убедитесь, что вы прочитали то, что отправляет клиент.

+0

Я добавил это вверху: 'char inn [500];' и это под ** client_fd ** 'size_t bytesRead = read (client_fd, inn, 500);' но как определить, сколько я должен читать? возможно, общие вещи, которые обычно отправляют веб-браузеры?которое должно быть не более 300 символов? –

+0

@ D0RV4 Если вы хотите обрабатывать HTTP-запросы, вам необходимо * узнать * [Протокол передачи гипертекста] (https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol). Подобно тому, как можно обнаружить, когда заголовок заканчивается и данные начинаются, что хорошо указано в RFC. –

+0

Кажется странным. Сервер должен заняться чтением входящих данных, чтобы открыть и закрыть внешний файл? действительно запутался здесь. почему он должен читать входящие данные. разве это просто работа, чтобы как-то просто ответить клиенту? –

0

popen выдаст ошибку «в настоящее время в процессе вызова открыты потоки». Я предлагаю вам проверить две строки:

fff = popen(ccc, "r"); 
if (fp == NULL) 

status=pclose(fff); 
if (status == -1) 
/* Error reported by pclose() */ 
. 
. 

надеюсь, что это помогает