2014-01-28 200 views
0

我是新的C++和套接字編程。我設法在unix機器上使用C++創建服務器,並將該服務器連接到在不同Windows計算機上運行的java客戶端。我也設法成功地從客戶端發送消息到服務器。我還沒有管理的是將消息從服​​務器發送到客戶端。我想這是我對C++新手,但我沒有在互聯網上找到一些非常有用的東西。我只發現C++客戶端到服務器通信代碼,而不是服務器到客戶端。有人可以提供一些指導嗎?將消息從C++服務器發送到java客戶端

日Thnx提前爲你的時間和你的幫助......

C++服務器代碼

int main(int argc, const char** argv) 
{ 


    /* SOCKET VARIABLES */ 
    int sock; 
    struct sockaddr_in server; 
    int mysock; 
    char buff[1024]; 
    int rval; 


    /*CREATE SOCKET*/ 
    sock =socket(AF_INET, SOCK_STREAM, 0); 

    if (sock<0) 
    { 
     perror("*FAILED TO CREATE SOCKET*"); 
     exit(1); 
    } 

    server.sin_family=AF_INET; 
    server.sin_addr.s_addr=INADDR_ANY; 
    server.sin_port=htons(5000); 

    /*CALL BIND*/ 
    if (bind(sock, (struct sockaddr *)&server, sizeof(server))) 
    { 
     perror("BIND FAILED"); 
     exit(1); 
    } 


    /*LISTEN*/ 
    listen(sock, 5); 


    /*ACCEPT*/ 
    do{ 

     mysock= accept(sock, (struct sockaddr *) 0, 0); 

     if (mysock==-1) 
     { 

      perror ("ACCEPT FAILED"); 
     } 
     else 
     { 
      memset(buff, 0, sizeof(buff)); 

      if ((rval=recv(mysock, buff, sizeof(buff), 0)) < 0) 
       perror("READING STREAM MESSAGE ERROR"); 
      else if(rval==0) 
       printf("Ending connection"); 
      else 
       printf("MSG: %s\n", buff); 

      printf("GOT THE MESSAGE (rval = %d)\n", rval); 

      } 

    }while (1) ; 
    return 0; 

Java客戶端代碼

public class SOK_1_CLIENT { 




    public void run() throws Exception 
    { 
     String adrress="172.16.151.237"; //localhost -- samemachine 
     Socket SOCK =new Socket (adrress,5000); 
     PrintStream PS =new PrintStream(SOCK.getOutputStream()); 
     PS.println("HELLO TO SERVER FROM CLIENT"); 

     InputStreamReader IR =new InputStreamReader(SOCK.getInputStream()); 
     BufferedReader BR = new BufferedReader(IR); 

     String MESSAGE =BR.readLine(); 
     System.out.println(MESSAGE + "java"); 
    } 


} 
+0

小心java的命名規則,因爲這是有點混亂,看代碼那麼多常量。 – SirDarius

回答

1

在C座是雙向的共產主義化的文件描述符。你可以使用send(2)給他們寫信。檢查man 2 send

char * buffer; 
size_t length, sent; 

while (length && (sent = send(mysock, buffer, length, 0)) > 0) { 
     length -= send; 
} 
if (sent < 0) 
    perror("send"); 

請注意,不像Java的BufferedWriter用C send將不能保證發送整個緩衝區一氣呵成。因此,while循環。如果你需要緩衝套接字IO,那麼你可以使用fdopen來創建一個stdio流,但是如果你希望能夠傳遞標誌和攔截套接字錯誤,那麼不推薦這樣做。

0

使用send()與最後一個參數(標誌)如果你使用的是Windows,那麼你可能還需要初始化和清理的Winsock設置爲0

- 檢查​​。

1

好的我看到你已經設法接收C++服務器中的消息並從java客戶端發送。請參閱java中的「從套接字接收」和C++中的「從套接字發送」。在上面的代碼中使用它們,並記住服務器何時發送,在java客戶端應該期望從服務器獲得數據時。這將解決你的問題。

如果你想使服務器 - 客戶端,如聊天應用程序,你有兩種可能性:

  • 使用 「選擇」
    • 使用 「線程」

谷歌根據您的要求和使用的語言突出顯示關鍵字。

看到this在C++插槽和this對Java插座

+0

thnx很詳細的信息...這真的很有幫助..但我已經解決了我的問題已經得益於以前的答案。我不想要聊天類型的應用程序。直到現在我正在嘗試...我的工作真正需要的只是從server2client發送消息...... Thnx又一次! –

相關問題