2015-02-06 3 views
3

PHP 페이지와 C++ 코드 사이에 TCP 소켓 연결을 만들었습니다. 여기에 대한 C + + 코드입니다.PHP와 C++ 간의 소켓 연결

Server.cpp

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
using namespace std; 

int main(){ 
    int create_socket,new_socket,fd; 
    int n; 
    socklen_t addrlen; 
    struct sockaddr_in address; 
    if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0) 
     cout<<"The socket was created\n"; 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY;inet_addr("localhost"); 
    address.sin_port = htons(4000); 
    cout<<"\nworking"; 
    if (bind(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0) 
     cout<<"Binding Socket\n"; 
    while(1){ 
     listen(create_socket,3); 
     addrlen = sizeof(struct sockaddr_in); 
     cout<<"*************************\n"; 
     new_socket = accept(create_socket,(struct sockaddr *)&address,&addrlen); 
     cout<<"*************************\n"; 
     char dobj[1024]; 
     if (new_socket > 0){ 
      n = read(new_socket, dobj, 1023); 
      string query(dobj); 
      string strl(query); 
      string s, d; 
      istringstream iss(strl); 
      iss >> s; 
      iss >> d; 
      const char* source = s.c_str(); 
      const char* dest = d.c_str(); 
      printf("Here is the message: %s %s\n",source,dest); 
      n = write(new_socket, "I got your message", 18); 
     } 
    } 
    close(new_socket); 
    return close(create_socket); 
} 

과 PHP 코드는 index.php를

<?php 
    if (isset($_GET['submit'])){ 
     $query = $_GET['query']; 
     echo $query; 
     error_reporting(E_ALL); 
     $service_port = 4000; 
     $address = "localhost"; 

     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
     if ($socket === false){ 
      echo "Failed: ". socket_strerror(socket_last_error($socket))."\n"; 
     } 

     echo "Attempting to connect to '$address' on port '$service_port'...'\n"; 
     $result = socket_connect($socket, $address, $service_port); 

     if ($result === false){ 
      echo "Failed: ". socket_strerror(socket_last_error($socket))."\n"; 
     } 

     $in = $query; 
     $out = ''; 

     echo "Sending...\n"; 
     socket_send($socket, $in, strlen($in), MSG_WAITALL); 
     echo "OK.\n"; 

     echo "Reading response:\n\n"; 
     while ($out = socket_read($socket, 2048)) { 
      echo $out; 
     } 

     socket_close($socket); 
    } 
?> 

<html> 
<head> 
</head> 
<body> 
    <form action="index.php" method="get"> 
     Query: <input type="text" name="query"> 
     <button type="submit" name="submit">Submit!</button> 
    </form> 
</body> 
</html> 

내가 인덱스를 실행 browser.When에 터미널과 실행의 index.php에 Server.cpp를 실행합니다. 브라우저에서 PHP를 실행하고 "123456 7890"이라고 입력하면 서버는 터미널에서 메시지 123456 7890을 출력합니다.

하지만 서버가 브라우저에서 index.php에 "메시지를 받았습니다"라는 메시지를 다시 보낼 수 없습니다. Ctrl + C를 눌러 서버를 종료 할 때만 index.php에 메시지를 보내고 index.php 만 브라우저의 모든 내용을 표시합니다. 여기에 무슨 문제가 있습니까? Server.cpp에서 socket을 청취하고 메시지를 무한히 index.php로 보내고 싶습니다.

+0

관련없는 내 대답을 확인,하지만 당신은 성공하지 오류를 확인하십시오. 오류를 확인하고 보고서를보고 무시하는 대신 오류를 처리해야합니다. –

+0

사실, PHP에서 코드의 소켓 부분을 작성하고 터미널을 통해 실행하면됩니다. 잘 작동한다. 나는 브라우저에서 무슨 일이 일어 났는지 모른다. – skjindal93

+0

효과가있었습니다. PHP 코드의 while 루프에서 echo $ out 라인 뒤에 "break"를 추가하면됩니다. 감사..:) – skjindal93

답변

2

소켓을 비 차단 (O_NONBLOCK 플래그가있는 fcntl)으로 구성하지 않은 것 같습니다. 따라서 읽기 작업 인 read(new_socket, dobj, 1023);은 1023 바이트를 수신 할 때까지 차단됩니다.

소켓을 비 블로킹으로 구성하거나 한 번에 더 적은 바이트를 읽을 수 있습니다. 그러나 가장 좋은 해결책은 첫 번째 것입니다. 이 문제에 대한 전체 솔루션에 대한 자세한 내용은

이 문제에 here