[英]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
您只在out_sock == -1
時初始化remote
。 第二次調用remote
函數將是未初始化的,因此您會收到錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.