2017-03-25 3 views
-1

私のC++は、C++クライアント

#include "mbed.h" 
#include <TCPSocket.h> 
#include <EthInterface.h> 
#include "EthernetInterface.h" 
#include "string.h" 
#include "ESP8266Interface.h" 
ESP8266Interface wifi(D1, D0); 
void ClearBuffer(); 
char rbuffer[300]; 
int rcount; 
int main() { 
    printf("Main\n\r"); 
    printf("Connecting...\n\r"); 
    int ret = wifi.connect("ssid","password", NSAPI_SECURITY_WPA_WPA2); 
    if (ret != 0) { 
     printf("\r\n*** WiFi Connection error ***\r\n"); 
     return -1; 
    } 
    printf("IP Address is %s\r\n", wifi.get_ip_address()); 


    //create socket 
    TCPSocket sock; 
    sock.open(&wifi); 
    int ret2 = sock.connect("address", port);//ip of google cloud VM 
    if(ret2 != 0) 
    { 
     printf("*** Socket connection error ***\r\n"); 
     return -1; 
    } 

    sock.set_blocking(false); 

    //sending to java server 
    char sbuffer[] = "Hello from client\r\n\r\n"; 
    int scount = sock.send(sbuffer, sizeof sbuffer); 
    printf("sent %d [%.*s]\r\n", scount, strstr(sbuffer, "\r\n")-sbuffer, sbuffer); 


    //recieve from java server 
    rcount = sock.recv(rbuffer, sizeof rbuffer); 
    printf("recv %d [%.*s]\r\n", rcount, strstr(rbuffer, "\r\n")-rbuffer, rbuffer); 
    printf("Done\r\n"); 
    // sock.close(); 


    wifi.disconnect(); 
} 

の下に示し、クライアントとJavaサーバー

System.out.println("Just connected to " + server.getRemoteSocketAddress()); 
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream())); 


Waiting for client on port 8082... 
Hello from client 

にJavaサーバからの応答を取得することはできませんが、私は試してみて、このようなC++クライアントに何かを送信するとき:

PrintWriter out = new PrintWriter(new OutputStreamWriter(server.getOutputStream())); 
String s = "Hello from server\0"; 
out.println(s); 
out.flush(); 

受信するためのC++クライアントコード:

rcount = sock.recv(rbuffer, sizeof rbuffer); 
printf("recv %d [%.*s]\r\n", rcount, strstr(rbuffer, "\r\n")-rbuffer, rebuffed); 

私の出力は、次のとおりです。

sent 22 [Hello from client] 
recv -3001 [] 

誰もが私はCクライアントに送り返す文字列が機能しない理由私が把握助けることができますか?

ありがとうございます。

+0

が、それは、CまたはC++ですか? Cにはクラスがないので、どのようにsockインスタンスで 'send'と' recv'を呼びますか?実際に 'recv'は正の' ssize_t'、 '0'または' -1'を除いて何も返さないようにすべきではありません。私たちはあなたを助けるためにもっとコードを見る必要があります。 – Jack

+0

私はC++を使用しています。コードはmeedsのOSを持っているFRDM K64上で実行されています。 – Shox88

答えて

0

strstr()、printf( "%s ...")などはNUL終了文字配列で動作します。アレイ上でそれらを呼び出すしっかりNUL終端されていないことで、未定義の動作、例えば:

rcount = sock.recv(rbuffer, sizeof rbuffer); 
printf("recv %d [%.*s]\r\n", rcount, strstr(rbuffer, "\r\n")-rbuffer, rebuffed); 

試してみてください。

rcount = sock.recv(rbuffer, (sizeof rbuffer)-1); 
if(rcount>0){ 
    rbuffer[rcount]='\0'; 
    printf("recv %d [%.*s]\r\n", rcount, strstr(rbuffer, "\r\n")-rbuffer, rebuffer); 
    } 
    else 
    if (rcount=0) (printf("Socket closed") 
    else 
    printf("Error on socket"); // get perror, errno, getLastError or whatever.. 
関連する問題