【问题标题】:Reading message from socket hangs从套接字读取消息挂起
【发布时间】:2015-01-28 16:21:57
【问题描述】:

我正在尝试使用 TCP 连接到 pop3 邮件服务器,但是当我尝试 read() 时,connect() 之后的消息立即挂起。

int sd;
struct sockaddr_in server;

if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror ("Error: socket()\n");
    return errno;
}

server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(ADDR);
server.sin_port = htons(PORT);

if (connect(sd, (struct sockaddr *) &server, sizeof(struct sockaddr)) == -1) {
    perror("Error: connect()\n");
    return errno;
}

char message[100];
read(sd, message, 100); // <== here it hangs
printf ("message: %s\n", message);

close (sd);

ADDR 是 IP,PORT 是我尝试连接的服务器的端口(在我的例子中是 188.125.69.47 和 995)。 根据我在 RFC 中读到的内容,在 connect() 之后,我应该会收到以下消息:

+OK hello from ....

【问题讨论】:

  • 您正在连接到 POP3s,这是基于 SSL 的 POP3。您需要先启动 SSL 连接。比较nc -v 188.125.69.47 995(那里什么都没有)和openssl s_client -connect 188.125.69.47:995+OK hello...)。

标签: c linux sockets ssl pop3


【解决方案1】:

您的读取不会给您任何信息,因为服务器没有发送任何数据。没错,在 POP3 服务器中应该首先向您发送一条问候消息,但是当您连接到POP3 over port 995 时,需要首先建立 SSL 会话。但是,这需要来自客户端的初始 handshake

您需要一个库来建立 SSL 连接,然后在 POP3 中通话,例如 OpenSSL

这个问题的答案可能也有帮助: How to use POP3 over SSL in C.

【讨论】:

  • 谢谢,我找到了this 示例,关于如何使用 ssl 并且现在可以使用了。
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2022-01-19
  • 2018-07-11
  • 1970-01-01
  • 2016-05-04
相关资源
最近更新 更多