2014-12-22 3 views
1

내가 누구의 홈 페이지입니다 (HTML에서) C++에서 간단한 HTTP 서버 만들려고 오전 : 사용자가 사용자 및 암호 필드에 작성 후 제출 버튼을 클릭하면로그인 HTTP 서버 C++

<!DOCTYPE html> 
<html> 
<head> 
    <title>home.html</title> 
</head> 
<body> 
    <form name="input" action="login.html" method="get"> 
     user name: <input type="text" name="user"><br> 
     password: <input type="text" name="password"> 
     <input type="submit" value="Submit"> 
    </form> 
</body> 
</html> 

을 다음 페이지가 나타납니다 :

<!DOCTYPE html> 
<html> 
<head> 
    <title>Contact info</title> 
</head> 
<body> 
    <h1>User: games</h1> 
    <h1>Password: bond</h1> 
</body> 
</html> 
내가 tcpsocket을 사용하고

하고 연결을 처리하는 코드 것은 :

tcp->listenAndAccept(); 
tcp->send(url.data(), url.length()); 

char buffer[1000]; 
tcp->recv(buffer, 1000); 
cout << buffer; 
tcp->recv(buffer, 1000); 
cout << buffer; 
int main() { 
    HTTPServer server(6060); 
    server.start(); 
    while(true) { 
     string msg; 
     cin >> msg; 
     if (msg == "x") { 
      break; 
     } 
    } 
    server.kill(); 
    return 0; 
} 

그리고 생성자는 다음과 같습니다 :주요 코드는 지금

HTTPServer::HTTPServer(int port) { 
    url = "HTTP/1.1 302 Found \r\nContent-Type: text/html; charset=utf8 \r\nContent-Length:279\r\n\r\n<!DOCTYPE html><html><head><title>Creating an HTML Element</title></head><body><form name=\"input\" action=\"login.html\" method=\"get\">user name: <input type=\"text\" name=\"user\"><br>password: <input type=\"text\" name=\"password\"><input type=\"submit\" value=\"Submit\"></form></body></html>"; 

    tcp = new TCPSocket(port); 
} 

내가 127.0.0.1:port를 입력 할 때 나에게 홈 페이지를 보여줍니다 콘솔에 대한 응답을 인쇄하지만 난 필드를 작성하는 경우 제출 버튼을 클릭하면 아무 일도 일어나지 않습니다. 두 번째 recv은 아무 것도 수신하지 않습니다. 두 번째 recv 전화가 수신되지 않는 이유는 무엇입니까?

+2

사이에 코드를 사용? –

+1

이제 질문을보십시오 계속하는 법을 모르겠다 ... – user3100708

+0

"... 179.0.0.1:port에 입장하면 ..."? 이것은 무엇을 의미 하는가? –

답변

1

브라우저는 "? key = value & key2 = value2"를 사용하여 웹 페이지에서 특정 값을 설정합니다. 양식을 지원하려면 서버가 물음표 문자를 확인해야합니다. 이 작업을 수행하는 좋은 방법은 패턴을 사용하는 것입니다 (다중 행이라고 가정).

^GET /?(.*+)(\?(.*))? HTTP/1.[01]$ 

이 정규 표현식에는 하나 또는 세 개의 그룹이 있습니다. 첫 번째는 실제 요청입니다 (앞의 슬래시는 무시). 두 번째 것은 정규 표현식에 전체 그룹을 한 번 또는 0 번 일치 시키라고 알려주는 것입니다. 최종 그룹은 변수입니다.

GET /index.html?user=MyUserName HTTP/1.1 

위의 HTTP 요청에서 정규식을 사용할 때 다음 그룹을 캡처합니다.

Group 1 = "index.html" 
Group 2 = "?user=MyUserName" 
Group 3 = "user=MyUserName" 

제출 버튼을 클릭하면 양식이 자동으로 "login.html"로 리디렉션되도록 설정됩니다. 기본 메소드가 GET이므로 "method ="get ""을 추가하지 않아도됩니다.

정규식 정규식에서 얻은 데이터는 서버에서 직접 처리해야합니다. 데이터가 정확하다면 서버가 클라이언트에게 유효한 세션 ID가 포함 된 쿠키를 보내고 로그인 된 웹 페이지를 표시하도록 할 수 있습니다. 그렇지 않으면 현재 웹 페이지를 약간 변경시킬 수 있습니다.

행운을 빌어 요!


참고 : 암호 필드의 입력 유형을 "password"로 설정할 수 있습니다.

참고 2 : 양식 이름 변경은 변경되지 않습니다. . 그러나 CSS를 사용하여 그것을 바꾸고 싶다면 "name ="을 "class ="로 바꿉니다. 이것은 CSS에서 .input이되거나 "id ="로 바뀌므로 CSS에서 #input이됩니다.


내가 실수를하면 언제든지 저를 시정 해주십시오.

편집 : 제출 버튼을 누르면 브라우저 주소 표시 줄의 URL이 변경됩니까?

편집 2 : 그것은 성공 코드의 경우, 그냥 페이지 및 양식 제출에 접근 구별 않습니다 (포함) (200) 및 코드에서 299