2017-03-17 11 views
1

モジュール「express」でPOSTリクエストを受け取るnodejsサーバがあり、POST要求を送信するためにC++を使用する必要がありますconnect()send ()関数は数値> 0を返しますが、私のサーバは何も受け取っておらず、エラーもありません。 これは、サーバーのコードnodejsサーバへのC++ POST要求が失敗しました(ソケットベース)

私のサーバー・コードと私のC++のコードで、私を助けてください、おかげで誰も(私がリクエストを送信するために、JSを使用する場合、それがうまく要求を受信することができますので、私のサーバーは良い実行されます。):!

app.post('/fps', function(req, res){ 
    var fpsFilename = "./native/Data/FpsFile.txt"; 
    console.log('execute the imagequality program'); 

    var exec = require('child_process').exec; 
    console.log('in fps post'); 
    exec('./native/fps ' + fpsFilename, function(err, data, stderr) { 
    if(data.length > 1) { 
     res.json({fps : data}); 
    } else { 
     console.log('fps file trans error'); 
    } 
    if(err) { 
     console.info('stderr from fps:'+stderr); 
    } 
    }); 
}); 

私のC++コード:

#define IPSTR "127.0.0.1" 
#define PORT 4001 
#define BUFSIZE 4096 
int MyBasicServerConnector::TestConnect() 
{ 
     int sockfd,ret,i ,h; 
     struct sockaddr_in servaddr; 
     char str1[4096], str2[2048], buf[BUFSIZE], *str; 
     socklen_t len; 
     fd_set t_set1; 
     struct timeval tv; 
     int isConneted = 0; 

     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
      { 

        printf("---------------------socket error!\n"); 
        exit(0); 
      } 

     bzero(&servaddr,sizeof(servaddr)); 
     servaddr.sin_family = AF_INET; 
     servaddr.sin_port = htons(PORT); 

     if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0) 
      { 

       printf("---------------------inet_pton error!\n"); 
       exit(0); 

      } 

      if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){  
        printf("---------------------connect error!\n"); 
        exit(0); 
      } 
      else 
      { 
      isConneted = 1; 
      std::cout <<"---------------------connect success"<<endl; 
      } 




       memset(str2, 0, 2048); 
       //strcat(str2, "name = x\n"); 
       //strcat(str2, "code = x"); 
       //str=(char *)malloc(128); 
       len = strlen(str2); 
       //sprintf(str, "%d", len); 

       memset(str1, 0, 4096); 
       strcat(str1, "POST /fps HTTP/1.1 \r\n"); 
       strcat(str1, "Host: 127.0.0.1:4001\r\n"); 
       strcat(str1, "Connection: keep-alive\r\n"); 
       strcat(str1, "Content-Length: 7\r\n"); 
       strcat(str1, "Accept: */*\r\n"); 
       strcat(str1, "Origin: http://127.0.0.1:4001\r\n"); 
       strcat(str1, "X-Requested-With: XMLHttpRequest\r\n"); 
       strcat(str1, "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36\r\n"); 
       strcat(str1, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n"); 
       strcat(str1, "Referer: http://127.0.0.1:4001/\r\n"); 
       strcat(str1, "Accept-Encoding: gzip, deflate, br\r\n"); 
       strcat(str1, "Accept-Language: en-US,en;q=0.8\r\n"); 


     if (isConneted > 0) 
     { 
      if(send(sockfd,str1 ,strlen(str1),MSG_NOSIGNAL)>0) 
      { 
       cout<<"ok\n"; 
      } 
      else 
      { 
       cout<<"xx\n"; 
      } 
     } 
     close (sockfd); 
     return 0; 
     } 
+0

これは誰でも助けてくれますか?これは非常に緊急です、ありがとうございます! – LeoHirasawa

+0

C++の送信とJSがwiresharkを使って送信するものを比較しましたか? – Jonas

答えて

0

私はあなたが実際にstandardを読み取ることにより、どのようにHTTPの仕事を勉強することをお勧めします。あなたの投稿にいくつかの誤りがあります。最も明白なは以下のとおりです。

  • 要求の1行目にHTTP/1.1後にスペースがあってはならない
  • あなたは7のコンテンツ長を宣言したが
  • はありませんがあるすべてのボディデータを送信しませんヘッダデリミタの終わり(空行\r\n
関連する問題