2013-01-08 43 views
0

我是socketpairs的新手,我需要我的孩子將每個信息從一個結構傳遞給parent.I被告知這可以使用SOCK_DGRAM完成,但我不知道該怎麼做。看看互聯網,但我找不到一個具體的例子。可以請你舉個例子鋤頭,你可以傳給父母一個由2個整數和一個字符串組成的結構嗎?我只是想要一個例子,所以我可以理解我可以建立這種socketpair,並通過it.Thank你linux fork socketpair sock_dgram

回答

1

如何以下發送信息:

int sockets[2]; 
if (socketpair(AF_INET, SOCK_DGRAM, 0, sockets) != -1) 
{ 
    int res = fork(); 

    if (res == 0) 
    { 
     /* In child process */ 

     /* We only need one socket, so close the other */ 
     close(sockets[0]); 

     struct some_structure my_struct; 

     write(sockets[1], &my_struct, sizeof(my_struct)); 

     /* All done */ 
     exit(0); 
    } 
    else if (res > 0) 
    { 
     /* In parent process */ 

     /* We only need one socket, so close the other */ 
     close(sockets[1]); 

     struct some_structure my_struct; 

     read(sockets[0], &my_struct, sizeof(my_struct)); 
    } 
} 

上面的代碼不檢查或處理,錯誤。它不能處理包含指針的結構,但是使用數組的結構也可以。

+1

'struct'包含一個字符串。如果這是'char *',這將發送一個沒有內容的指針。 –

+0

@Joachim Pileborg非常感謝你我會嘗試 –

+0

@EmilGrigore在Linux等POSIX系統中,套接字與創建和連接後的任何其他文件描述符沒有多大區別。您可以像讀取任何其他文件一樣讀取和寫入它們。 –

0

假設你的字符串表示爲char*

struct data { 
    int i, j; 
    char *s; 
}; 

你需要制定一些序列化格式,因爲發送指針將無法正常工作;指針對象不會被傳遞,因此它不會指向接收者(父對象)中的任何有用內容。一個簡單的格式將是把整數終端到終端,然後直接追加包括其NUL終結符,所以你會得到

int senddata(int fd, struct data const *d) 
{ 
    size_t msglen = 2 * sizeof(int) + strlen(d->s) + 1; 
    char *msg = malloc(msglen); 

    if (msg == NULL) 
     return -1; 

    ((int *)msg)[0] = d->i; 
    ((int *)msg)[1] = d->j; 
    strcpy(msg + 2 * sizeof(int), d->s); 

    ssize_t r = send(fd, msg, msglen, 0); 

    free(msg); 
    return r; 
} 

有相應的接收功能父。您可能希望在字符串上放置一些最大長度,因爲父級需要事先知道消息的大小。