我该如何从socket描述符中获取套接字类型?

16

我正在编写一个程序来捕获套接字网络流以显示网络活动。 因此,我想知道是否有任何方法可以从套接字描述符确定套接字类型。

我知道可以使用getsockname找到套接字族,但我找不到找到套接字类型的方法。

例如,我想知道这个套接字是作为UDP还是TCP打开的。 感谢您提前的任何建议。

YEH

1个回答

20

由于您提到了getsockname,我假设您在谈论POSIX套接字。

您可以通过使用SO_TYPE调用getsockopt函数来获取套接字类型。例如:

#include <stdio.h>
#include <sys/socket.h>

void main (void) {
    int fd = socket( AF_INET, SOCK_STREAM, 0 );
    int type;
    int length = sizeof( int );

    getsockopt( fd, SOL_SOCKET, SO_TYPE, &type, &length );

    if (type == SOCK_STREAM) puts( "It's a TCP socket." );
    else puts ("Wait... what happened?");
}
请注意,我的示例没有进行任何错误检查。在使用之前,您应该修复它。更多信息,请参阅getsockopt()sys/socket.h的POSIX.1文档。

getsockname()和getsockopt()并不仅限于POSIX。微软的Winsock API同样具备这些功能。 - Remy Lebeau
@Remy Lebeau 是的,它们都基于BSD套接字层。虽然存在一些关键性差异,但对getsockopt()这种简单用法来说可能是相同的。 - Sam Hanes
1
在 Visual Studio 中,我被迫将第四个参数转换为 char* getsockopt(_Master, SOL_SOCKET, SO_TYPE, (char*)&type, &length); if(type == SOCK_DGRAM) puts("udp"); else puts("tcp"); - Beyondo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接