1

在 Windows 平台中,我可以通过以下代码检查套接字是否连接:

bool isConnected(int socket)
{
    int err;
    int len = sizeof (err);
    getsockopt(socket, SOL_SOCKET, SO_ERROR, (char*)&err, &len);
    return err == 0;
}

在 OS X 中,这个函数总是返回 true。官方的做法是什么?

4

3 回答 3

2

此功能适用于 Windows 和 Mac 平台:

bool isConnected(int socket)
{
    int err;
    #ifdef __APPLE__
    uint32_t len;
    #elif _Windows
    int len;
    #endif
    sockaddr_in addr;
    len = sizeof (addr);
    err = getpeername(socket, (sockaddr*)&addr, &len);
    return err == 0;
}
于 2013-08-10T17:45:11.973 回答
1

我知道确定阻塞套接字是否已连接的唯一方法是执行实际的发送/接收操作并检查结果是否有错误。在 Windows 上,非阻塞套接字也可以针对套接字活动发出异步通知,例如FD_CLOSE断开连接。

一个SOL_ERROR派上用场的地方是非阻塞connect()呼叫。select()报告连接操作完成后,可SOL_ERROR用于确定是否connect()成功或失败的原因。

于 2013-08-10T15:38:22.280 回答
0

这 -if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) 与 Winsock 的isConnected.

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
  register int s;
  register int bytes;
  struct sockaddr_in sa;
  char buffer[BUFSIZ+1];

  if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket");
    return 1;
  }

  bzero(&sa, sizeof sa);

  sa.sin_family = AF_INET;
  sa.sin_port = htons(13);
  sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);
  if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
    perror("connect");
    close(s);
    return 2;
  }

  while ((bytes = read(s, buffer, BUFSIZ)) > 0)
    write(1, buffer, bytes);

  close(s);
  return 0;
}
于 2013-08-10T14:15:56.137 回答