[英]Unix datagram socket is sending message to itself instead of remote
我在同一台機器上運行的兩個進程之間打開了一個UNIX數據報套接字。 但是,我的客戶進程正在向自身而不是服務器發送請求。
我保持套接字綁定的FilePath不同。 但是,如果我保持Filepath不變,則盡管客戶端能夠向服務器發送請求,但是服務器向自身發送響應。 請檢查此鏈接以查找與此問題相關的問題。 那里幾乎有完整的代碼。
一對UNIX套接字客戶端服務器之間無法交換消息,只能以rand交換消息
以下是客戶端上有問題的代碼段:
int msimcli_ConnectToSocket(const char* socketFile,int isSockTypeStreaming, SOCKET_PARAMS* socketParam)
{
int rc = ROK;
int result = 0;
char buffer[CLI_MAX_BUF_SIZE];
int buffer_size = CLI_MAX_BUF_SIZE;
int option = 1;
socklen_t len;
MSIM_ZERO(*socketParam);
pthread_t snd_tid;
pthread_t rx_tid;
if (isSockTypeStreaming)
{
socketParam->type = SOCK_STREAM;
}
else
{
socketParam->type = SOCK_DGRAM;
}
socketParam->fd = socket(AF_UNIX, socketParam->type, 0);
if (0 > socketParam->fd)
{
rc = RFAILED;
goto Exit;
}
else{
printf("socket created successfully with socket descriptor %d\n",socketParam->fd);
}
rc = setsockopt(socketParam->fd, SOL_SOCKET, (SO_REUSEADDR), &option, sizeof(option));
if (-1 == rc)
{
printf("setsockopt failed\r\n");
close(socketParam->fd);
socketParam->fd = -1;
goto Exit;
}
/* Bind Unix socket to a FilePath */
socketParam->remote.sun_family = AF_UNIX;
unlink(socketParam->remote.sun_path);
strcpy(socketParam->remote.sun_path, socketFile);
socketParam->len = strlen(socketParam->remote.sun_path) + sizeof(socketParam->remote.sun_family) + 1;
rc = bind(socketParam->fd, (struct sockaddr*)&socketParam->remote, socketParam->len);
if (-1 == rc)
{
printf("setsockopt failed\r\n");
close(socketParam->fd);
socketParam->fd = -1;
goto Exit;
}
/* Create Receiver thread */
if(ROK != (rc = pthread_create(&rx_tid,NULL,msimcli_RecvFromSocket,NULL)))
{
printf("Thread create for Receiver failed\n");
goto Exit;
}
Exit:
if (ROK != rc)
{
printf("%s: errno=0x%x %s\r\n", __FUNCTION__,errno, strerror(errno));
if (-1 < socketParam->fd)
{
close(socketParam->fd);
socketParam->fd = -1;
}
}
printf("<< rc %d\r\n", rc);
return rc;
}
int msimcli_SendToSocket(void* buf)
{
int rc = ROK;
/*Test buffer*/
cliCmd *buff = (cliCmd *)buf;
printf("Buff %s\n", ((cliCmd *)buf)->buf);
for (int i = 0; i < buff->hdr.msglen; i++)
{
printf("[%x]", buff[i]);
}
printf("\n");
printf("sending on socket [%d]\n",datagramSocket.fd);
rc = sendto(datagramSocket.fd, buf, buff->hdr.msglen, 0, \
(struct sockaddr *)&datagramSocket.remote, datagramSocket.len);
if (rc == -1) {
printf("%s: errno=0x%x %s\r\n", __FUNCTION__,errno, strerror(errno));
printf("SENDTO ERROR\n");
close(datagramSocket.fd);
return 0;
}
else {
printf("Data sent!\n");
return rc;
}
}
我希望兩個過程之間能夠順利進行消息交換。
您沒有包括最小的可復制示例。 同樣不清楚sendgram函數中datagramSocket的來源。
但是,在我看來,發送方和接收方都使用完全相同的套接字。
您需要做的是使用一對插座; 那是一個套接字對:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.