簡體   English   中英

Unix數據報套接字僅適用於第一幀

[英]Unix Datagram Socket works for first frame only

我正在嘗試使用UNIX數據克套接字進行IPC,但我遇到了實現問題。 我能夠成功地執行UNIX流套接字,但我的程序的功能要求使用數據克。

以下是發送方的代碼:

struct sockaddr_un remote;
struct sockaddr_un local;
socklen_t size_remote;
socklen_t size_local;
if(out_sock == -1)
{
    if ((out_sock = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1)
    {
        perror("toYYYYY socket");
        exit(1);
    }

    char remote_path[28] = "/tmp/sockets/fromXXXXXXX0000";
    sprintf(remote_path + 24, "%d", portOffset + XXXXXX_CTRL_UDP_PORT);
    memset(&remote, 0, sizeof(struct sockaddr_un));
    remote.sun_family = AF_UNIX;
    strcpy(remote.sun_path, remote_path);
    size_remote = (offsetof(struct sockaddr_un, sun_path) + strlen(remote_path));

    char local_path[28] = "/tmp/sockets/toYYYYY0000";
    sprintf(local_path + 20, "%d", portOffset + XXXXXX_CTRL_UDP_PORT);
    memset(&local, 0, sizeof(struct sockaddr_un));
    local.sun_family = AF_UNIX;
    strcpy(local.sun_path, local_path);
    size_local = (offsetof(struct sockaddr_un, sun_path) + strlen(local_path));

    unlink(local_path);
    int rtv = bind(out_sock, (struct sockaddr *)&local, size_local);
    if(rtv)
            perror("toYYYYY bind");

}
written = sendto(out_sock, packet, bytes, 0, (struct sockaddr *)&remote, size_remote);

if (written != bytes)
{
    status = AS_FAILURE;
    perror("toYYYYY send");
}

return status;

接收方將毫無疑問地獲得第一幀發送。 但是,sendto函數會在此成功發送時拋出“No such file or directory”錯誤。 以下兩個發送產生相同的錯誤,但sendto函數返回(-1)而不是像第一次調用中那樣正確的緩沖區長度。 在隨后的sendto調用中,錯誤變為“未連接Transort端點”。

接收過程復制/粘貼更復雜,但實際上它首先從套接字調用獲取文件描述符,設置地址結構,綁定和使用recvfrom()讀取。

以下是一個示例輸出日志,可能有用也可能沒用:

接收過程輸出

remote_len: 30
local_len: 26
local: '/tmp/sockets/toYYYYY5248' remote: '/tmp/sockets/fromXXXXXXX5248'
Binding to: '/tmp/sockets/fromXXXXXXX5248'
entered selected (This is receiving function with recvfrom())
recv from '/tmp/sockets/toYYYYY5248' len: 263
Closing socket

發送流程輸出

send (successful call): Success
send: No such file or directory
send: No such file or directory
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected

我的問題是:

  1. 如果SOCK_DGRAM是無連接的並且我正在使用sendto(),為什么它抱怨傳輸端點?
  2. 為什么這適用於要發送的第一幀,而不是其他幀? 為什么成功的框架仍然會出錯?
  3. 我怎樣才能解決這個問題?

您只在out_sock == -1時初始化remote 第二次調用remote函數將是未初始化的,因此您會收到錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM