2012-11-12 88 views
0

問題描述:在網絡中的兩臺不同的Unix機器上運行有兩個進程。將簡單信息(例如「Hi !!」)從一臺機器傳遞到另一臺機器的最簡單方法是什麼?我知道有很多IPC的方法,但最簡單的方法是什麼?網絡上兩臺機器之間的消息傳遞

Boost MPI在我的場景中有用嗎?我正在使用C++來實現我的實現。

+3

UDP/TCP連接併發送一些字節 –

回答

2

套接字。這裏是一個插座tutorial。一旦你有一個插座,你也可以使用boost sockets

+0

爲什麼我不能使用Boost:MPI導致我只需要傳遞一個小消息? – user1755967

1

使用套接字(我會建議boost套接字)或看看ZeroMQ。 ZeroMQ實際上可能更容易,因爲它可以保證總是收到完整的消息。

0

這很簡單嗎? (使用純MPI標準而不象Boost.MPI任何第三方庫調用)

#include <string> 
#include <iostream> 
#include <mpi.h> 

using namespace std; 

int main (int argc, char **argv) { 
    // Initialise the MPI library 
    MPI_Init(&argc, &argv); 

    int rank, size; 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if (size != 2) { 
     if (rank == 0) 
     cout << "ERROR: You must run this program with 2 processes" << endl; 
     MPI_Abort(MPI_COMM_WORLD, 0); 
    } 

    if (rank == 0) { 
     // Rank 0 sends the message 
     string hi = "Hi!"; 
     MPI_Send((void*)hi.c_str(), hi.length()+1, MPI_CHAR, 
       1, 0, MPI_COMM_WORLD); 
    } 
    else { 
     // Rank 1 receives the message 
     // Probe for a message and get its actual size 
     MPI_Status status; 
     MPI_Probe(0, 0, MPI_COMM_WORLD, &status); 
     int len; 
     MPI_Get_count(&status, MPI_CHAR, &len); 
     // Allocate buffer space for the message and receive it 
     char *message = new char[len]; 
     MPI_Recv(message, len, MPI_CHAR, 
       0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     cout << "Rank 1 received: " << message << endl; 
     delete [] message; 
    } 

    MPI_Finalize(); 

    return 0; 
} 

編譯mpic++ -o mpihi.exe mpihi.cc並執行:如果消息的長度是固定的預先

$ mpiexec -np 2 ./mpihi.exe 
Rank 1 received: Hi! 

的代碼可以簡化。可以使用Boost.MPI進一步簡化它,但我從來沒有使用它,所以我不能給你提供一個例子。

MPI的美妙之處在於它保證了消息的傳遞以及它抽象出互連細節的方式。您可以通過向mpiexec提供適當的選項來更改兩個MPI進程的位置。如果兩個進程都放在同一個物理節點上,則將使用共享內存來傳遞消息。如果放置在不同的節點上,則會使用一些網絡機制。

當然,這一切都取決於您的需求。 MPI庫是具有許多支持基礎設施的複雜代碼段,例如,你需要通過專用的啓動程序(在大多數情況下mpiexecmpirun)來運行你的代碼,你不能使用MPI簡單地連接兩個隨機過程(即你真的通過mpiexec/mpirun推出他們兩個)。

+0

謝謝你的例子,請你可以解釋一下,如果我想發送運行在機器「A」上的進程「新」的消息來處理運行在機器「B」上的「發佈」,那麼MPI將是有用的或者套接字或者某些其他機制 – user1755967

+0

如果兩個進程都是獨立啓動的(例如,它們是由'init'機制啓動的系統守護進程),那麼在這種情況下集成MPI可能非常困難。否則,您可以在MPI消息中發送任何您喜歡的內容。 MPI甚至支持異構環境,並且大多數實現可以在不同的內部表示之間動態地轉換消息數據,例如,一個大端的64位機器可以透明地將整數發送到一個32位的小端機器。 –

+0

我的進程不是守護進程,它實際上就像在機器A上運行的Process「new」應該在機器B上調用進程「publish」,所以像publish.exe這樣的簡單消息應該在機器B上運行,並通過機器A調用A – user1755967