c - Unix数据报套接字正在向自身而不是远程发送消息

标签 c multithreading sockets process

我在同一台机器上运行的两个进程之间打开了一个unix数据报套接字。但是,我的客户端进程正在向自身而不是服务器发送请求。

我保留了套接字绑定(bind)的 FilePath 不同。但是,如果我保持文件路径相同,那么尽管客户端能够向服务器发送请求,但服务器向自身发送响应。 请检查此链接以获取与此问题相关的问题。那里有几乎完整的代码。

Not able to exchange message between a pair of unix socket client server to exchange messages randonly

下面是客户端有问题的代码片段:

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;                                                                                                        
   }                                                                                                                    
}   

我希望两个进程之间能够顺利进行消息交换。

最佳答案

您没有包含最小的可重现示例;也不清楚 datagramSocket 在发送者函数中来自哪里。

但是,对我来说,发送者和接收者似乎都使用完全相同的套接字。

您需要做的是使用一对套接字;这是一个套接字对:

Socketpair() in C/Unix

关于c - Unix数据报套接字正在向自身而不是远程发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57010875/

相关文章:

c - 无法解决此错误 "Access violation"

c - 我如何操纵位从0x00到0x34,以便创建由这些值表示的卡座

c - fread/ftell 显然在 Windows 下损坏,在 Linux 下工作正常

c++ - Boost 的作用域互斥锁和 WinAPI 的临界区有区别吗?

c - 如何获得最快的数据处理方式: fork or/and multithreading

.net - 这似乎是并发集合/队列组合的合理方法吗?

java - 持久 TCP 连接客户端/服务器

c - C 语言无法识别字符串

c - 从 C 套接字读取预期数据包的最大大小

c - 使用 select 检测服务器套接字关闭