Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C (如何)从套接字描述符中找到套接字类型?_C_Networking_Sockets - Fatal编程技术网

C (如何)从套接字描述符中找到套接字类型?

C (如何)从套接字描述符中找到套接字类型?,c,networking,sockets,C,Networking,Sockets,我正在编写一个程序来捕获套接字网络流以显示网络活动。 为此,我想知道是否有任何方法可以从套接字描述符确定套接字类型 我知道我可以使用getsockname查找套接字族,但我找不到查找套接字类型的方法 例如,我想知道这个套接字是以UDP还是TCP的形式打开的。 提前谢谢你的建议 是的既然你提到了getsockname,我想你说的是POSIX套接字 您可以通过使用SO\u type调用getsockopt函数来获取套接字类型。例如: #include <stdio.h> #include

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

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

例如,我想知道这个套接字是以UDP还是TCP的形式打开的。 提前谢谢你的建议


是的

既然你提到了
getsockname
,我想你说的是POSIX套接字

您可以通过使用
SO\u 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?");
}
#包括
#包括
真空总管(真空){
int fd=套接字(AF_INET,SOCK_STREAM,0);
int型;
int length=sizeof(int);
getsockopt(fd、SOL_插槽、SO_类型、类型和长度);
if(type==SOCK_STREAM)放入(“这是一个TCP套接字”);
else提出(“等等……发生了什么事?”);
}

请注意,我的示例没有执行任何错误检查。你应该在使用它之前修复它。有关更多信息,请参阅和的POSIX.1文档。

getsockname()和getsockopt()不是POSIX特有的。微软的Winsock API也有它们。@Remy Lebeau是的,它们都基于BSD套接字层。有一些关键的区别,但是getsockopt()的这种简单用法可能是相同的。在visual studio中,我被迫将第四个参数转换为char*
getsockopt(\u Master,SOL\u SOCKET,SO\u TYPE,(char*)&TYPE,&length)
if(type==sockdgram)put(“udp”);其他认沽权(“tcp”)