[英]Check if a socket is connected in mac os x
在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。 官方的做法是什么?
此功能適用於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;
}
這個 - 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;
}
我知道確定阻塞套接字是否已連接的唯一方法是執行實際的發送/接收操作並檢查結果是否有錯誤。 在Windows上,非阻塞套接字也可以在套接字活動上發出異步通知,例如FD_CLOSE
用於斷開連接。
一個地方SOL_ERROR
派上用場就是一個非阻塞的connect()
調用。 select()
報告連接操作完成后, SOL_ERROR
可用於確定connect()
是否成功或失敗的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.