【问题标题】:Socket communcation between C and PythonC和Python之间的套接字通信
【发布时间】:2012-11-07 12:04:35
【问题描述】:

我刚刚尝试了一个非常简单的示例来开始使用套接字在 C 应用程序和 Python 之间进行通信。这是非常简单的 Python 脚本:

import socket

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/demo_socket")
print "Sending..."
s.send("Hello C from Python!")
data = s.recv(1024)
s.close()
print 'Received', repr(data)

这里是相应的 C 代码,没有标题:

int main(void)
{  
  struct sockaddr_un address;
  int socket_fd, connection_fd;
  socklen_t address_length;
  pid_t child;  

  char buffer[256];
  int n;

  socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);
  if (socket_fd < 0){
      printf("socket() failed\n");
      return 1;
  } 

  unlink("/tmp/demo_socket");
  memset(&address, 0, sizeof(struct sockaddr_un));

  address.sun_family = AF_UNIX;
  snprintf(address.sun_path, UNIX_PATH_MAX, "/tmp/demo_socket");

  if (bind(socket_fd, (struct sockaddr *) &address, sizeof(struct sockaddr_un)) != 0) {
      printf("bind() failed\n");
      return 1;
  }
  if(listen(socket_fd, 5) != 0) {
      printf("listen() failed\n");
      return 1;
  }

  address_length = sizeof(address);  
  while((connection_fd = accept(socket_fd, 
                   (struct sockaddr *) &address,
                   &address_length)) > -1)
  {
      printf("successfully received data\n");
      bzero(buffer,256);
      n = read(connection_fd,buffer,255);
      if (n < 0) error("ERROR reading from socket");
         printf("Here is the message: %s\n\n", buffer);
      strcpy(buffer, "Hi back from the C world"); 
      n = write(connection_fd, buffer, strlen(buffer));
      if (n < 0) 
         printf("ERROR writing to socket\n");           
      break;      
  }
  close(socket_fd);
  close(socket_fd);
  return(0);
}

然后并行运行时输出如下:

 Successfully received data
 Here is the message: Hello C from Python!

 ERROR writing to socket
 close failed in file object destructor:
 Error in sys.excepthook:

 Original exception was:

所以好消息是,从 Python 世界接收东西可以正常工作,但是当我试图写回一些东西时,我得到了一个错误,而且我最后似乎得到了一个异常。有人知道我在这里做错了什么吗?

编辑:谢谢大家,我按照您的建议进行了更正,消息交换工作正常,只是 C 应用程序仍在造成问题,我不知道为什么......

close failed in file object destructor:
Error in sys.excepthook:

Original exception was:

【问题讨论】:

  • 当您收到来自write 的错误时,您可以使用strerror 打印出什么错误。但是,在您的情况下,很容易看到...只需检查您正在写入的 哪个 套接字!
  • 请问您遇到了什么错误?
  • 哦,是的,人为失败...... ;-) @JoachimPileborg
  • 您的问题实际上与 Python 无关,而与您的 C 后端有关。
  • OT: 1 您无法在connection_fd 上致电close()。 2 没有必要为address_length 分配任何内容,因为它将通过对accept() 的调用来设置。

标签: python c sockets pipe


【解决方案1】:

你正在尝试写入监听套接字

write(socket_fd, buffer, strlen(buffer));

你应该试试

write(connection_fd, buffer, strlen(buffer));

【讨论】:

  • 太好了,效果很好。但是,C 应用端仍然有一个奇怪的错误消息:close failed in file object destructor: Error in sys.excepthook: Original exception was:
【解决方案2】:

您收到警告是因为您关闭了两次 socket_fd。

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 2016-10-29
    • 2018-01-09
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多