如何判断STDIN是否绑定到套接字,在C中

时间:2014-10-31 08:14:15

标签: c sockets stdin

我想知道是否有人知道如何判断bash的stdin或stdout是否绑定到套接字,在C?

2 个答案:

答案 0 :(得分:2)

我不知道为什么人们会对这个问题进行讨论,以及为什么他们会说bash解决问题时表明解决方案应该在 c ,无论如何都有合理的用例。

我对这个问题没有真正的最终答案,但如果我遇到这个问题,我会尝试在文件描述符上使用特定于套接字的调用并检查它是否成功。例如:

// Untested
int socktype;
int optlen = sizeof(int);
if(getsockopt(sockfd, SOL_SOCKET, SO_TYPE, &socktype, &optlen) < 0) {
    // this is maybe not a socket ...
    if(ENOTSOCK == errno) {
        // This is not a socket ...
    }
} else {
    // probably a socket ...
}

返回值会告诉我(不是100%确定)描述符是否是套接字。

如果成功,您可以使用更具体的调用进行升级,例如使用IP级别或TCP级别选项。这会告诉你你有什么样的插座。

请参阅:

答案 1 :(得分:0)

fstat。根据此手册页,宏S_ISSOCK不在POSIX中,因此可能无法在所有环境中使用。

此代码应该为stdin(未经测试)执行此操作。要检查stdout,请使用STDOUT_FILENO代替STDIN_FILENO

struct stat st;

if (fstat(STDIN_FILENO, &st) < 0) {
    perror("fstat on stdin");
    exit(errno);
}

if (S_ISSOCK(st)) {
    /* it is a socket! */
}