【问题标题】:Unix Socket returns ECONNRESET, and server doesn't even get accept to stop blockingUnix Socket返回ECONNRESET,服务器甚至没有接受停止阻塞
【发布时间】:2015-05-22 06:01:24
【问题描述】:

所以,我正在使用 Unix 套接字,它们在一段时间内运行良好。现在,当我连接时,我得到一个ECONNRESET 并且服务器的接受甚至不会停止阻塞。 接受代码:

socklen_t slt = sizeof(sun);
int i = accept(sockfd, (struct sockaddr *)&sun, &slt);

阅读代码:

jbyte* ra = malloc(size);
memset(ra, 0, size);
int i = read(sockfd, ra, size);

还有很多,但这都是通过 JNI 实现的。我已经通过调试验证了接受挂起,套接字正在侦听等。我还验证了它们永远不会停止阻塞。此外,我写了一个,然后当我尝试阅读时,我得到一个ECONNRESET。我的服务器以非特权用户身份运行,而我的客户端以 root 身份运行。

socket文件(s,有两种情况),来自ls -la

srwxr-xr-x  1 ap_6840 ap_6840      0 May 21 22:52 .api.sock
srwxr-xr-x  1 ap_6840 ap_6840      0 May 21 22:52 .http.sock

所以,它们是创建、侦听等。如果您想要更多代码,请告诉我。

编辑:

连接代码:

struct sockaddr_un sun;
sun.sun_family = AF_UNIX;
strncpy(sun.sun_path, npath, 108);
int i = connect((int)sockfd, (struct sockaddr *)&sun, sizeof(sun));

npath 是我的文件。 整个 C 文件:https://github.com/JavaProphet/Avuna-HTTPD/blob/master/csrc/org_avuna_httpd_util_CLib.c

Java 代码将其绑定在一起:https://github.com/JavaProphet/Avuna-HTTPD/tree/master/src/org/avuna/httpd/util/unixsocket

【问题讨论】:

  • 我还验证了它正在连接到正确的文件。
  • 您需要提供比这更多的代码。我想看看连接代码和读写代码。目前最明显的结论是你连接到了错误的东西。
  • @EJP 我在帖子中添加了更多代码,并链接到所有代码。
  • 没有链接。构成问题一部分的代码必须包含在问题中。
  • 内核没有理由阻止任何东西。使用strace 实际验证客户端/服务器代码是否按照您的想法执行。

标签: c++ c linux sockets unix


【解决方案1】:

问题是我的控制台被隐藏在 2 个父进程下,所以我从来没有看过它。我在我的 accept 方法中调用堆栈内存上的 free 。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多