2017-11-02 5 views
0

수신 상태 인 TCP 서버 (C 코드)가 있습니다. 이제는 API없이 브라우저 (firefox)에서 TCP 서버에 연결하려고합니다. 브라우저가 해독하여 웹 페이지로 표시되기를 원하는 HTML 코드를 다시 보냅니다.tcp 서버에서 브라우저로 다시 응답합니다.

나는 TCP 서버를 청취 상태로 유지하고 브라우저에 아래 URL을 입력하면 연결 허용 메시지가 표시됩니다. [URL은 000.000.0.0:6859라고 말하면서] 다른 포트 번호를 입력하여 확인했습니다. . 누군가 여기서 일어나는 일을 설명해 줄 수 있습니까? 내가 뭘 놓치고 있니?

  1. 브라우저에서 (수신 상태를에) TCP 서버에 연결 요청을 보내기 :

    char m[1024]="HTTP/1.1 200 OK\r\n Content-length: %ld\r\n Content-Type: text/html\r\n <html><body> <h1>Hello world </h1></body></html>"; 
    
    send(client_sock,m,strlen(m),0); 
    

    또한, 나는 도움이 필요합니다.

  2. 브라우저가 웹 페이지를 받아서 디코딩하고 표시하도록하십시오.

올바른 방향으로 알려주십시오.

답변

1

왜 각 HTTP 헤더 이름 앞에 공백을 넣고 있습니까? 그들은 거기에 속하지 않습니다.

더 중요한 것은 헤더와 HTML 사이에 \r\n이 필요하다는 것입니다. HTTP 헤더는 \r\n 쌍으로 HTTP 본문과 구분되지만 만 전송합니다.

또한 Content-Length 헤더에 HTML의 유효한 바이트 수가 채워지지 않습니다. 문자 그대로 %ld을 브라우저에 보내고 있습니다.

더이 대신 같은 것을보십시오 : 또는

const char *fmt = "HTTP/1.1 200 OK\r\n" 
        "Content-length: %ld\r\n" 
        "Content-Type: text/html\r\n" 
        "\r\n" 
        "%s"; 

const char *data = "<html><body><h1>Hello world</h1></body></html>"; 
int datasize = strlen(data); 

char m[1024]; 
sprintf(m, fmt, datasize, data); 

send(client_sock, m, strlen(m), 0); 

: 또는

int sendStr(int sock, const char *s) 
{ 
    return send(sock, s, strlen(s), 0); 
} 

... 

const char *data = "<html><body><h1>Hello world</h1></body></html>"; 
int datasize = strlen(data); 

char clbuf[32]; 
sprintf(clbuf, "Content-length: %ld\r\n", datasize); 

sendStr(client_sock, "HTTP/1.1 200 OK\r\n"); 
sendStr(client_sock, clbuf); 
sendStr(client_sock, "Content-Type: text/html\r\n"); 
sendStr(client_sock, "\r\n");   
send(client_sock, data, datasize, 0); 

: 모든 도움

int sendStr(int sock, const char *s) 
{ 
    return send(sock, s, strlen(s), 0); 
} 

int sendStrFmt(int sock, const char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    int size = vsnprintf(NULL, 0, fmt, args); 
    if (size > 0) { 
     char *buf = malloc(size+1); 
     if (buf) { 
      vsnprintf(buf, size+1, fmt, args); 
      result = send(sock, buf, size, 0); 
      free(buf); 
     } else { 
      result = -1; 
     } 
    } 
    else if (size == 0) { 
     result = 0; 
    } 
    else { 
     result = -1; 
    } 
    va_end(args); 
    return result; 
} 

... 

const char *data = "<html><body><h1>Hello world</h1></body></html>"; 
int datasize = strlen(data); 

sendStr(client_sock, "HTTP/1.1 200 OK\r\n"); 
sendStrFmt(client_sock, "Content-length: %ld\r\n", datasize); 
sendStr(client_sock, "Content-Type: text/html\r\n"); 
sendStr(client_sock, "\r\n"); 
send(client_sock, data, datasize, 0); 
+0

감사 톤! 그것은 효과가있다. 나는 이제 각 HTTP 헤더 이름 앞의 공백을 인식하지 못했으며, 지금 배운 교훈을 알지 못했다. – Dee

+0

나는 의심이 하나 더있다. 내가 TCP 서버에서 양식을 전달하고 브라우저에서 볼 수있는 데이터를 '클라이언트 _ 메시지'[char client_message [2000];] 변수를 수신하는 데이터를 내 TCP 서버에 전달 가져옵니다 제출 단추를 클릭합니다. char 데이터 형식 : – Dee

+0

POST/HTTP/1.1 호스트 : IP : Portno 사용자 에이전트 : Mozilla/5.0 (X11, Linux x86_64, rv : 45.0) Gecko/20100101 Firefox/45.0 수락 : text/html, application/ 수락 언어 : ko-ko, ko, ko, ko, ko, ko, ko, PORTNO/ 연결 : 연결 유지 콘텐츠 유형 : application/x-www-form-urlencoded 콘텐츠 길이 : 59 na me = Adam & age = 40 & addr = 아니요.+10 & Location = 방갈로르 & 성별 = 남성 – Dee