2011-02-04 89 views
1

我正在从事网络可靠性模拟工作,我需要根据服务质量百分比模拟丢包。目前我有一个DLL挂钩到sendsendto,recvrecvfrom。然后,我的钩子根据服务质量“丢弃”数据包。在winsock中检索套接字协议

我只需要将挂钩应用于UDP数据包,并且不打扰TCP(TCP用于远程调试)。

有没有一种方法可以查询WinSock中套接字绑定的协议?

int WSAAPI HookedSend(SOCKET s, const char FAR * buf, int len, int flags) 
{ 
    //if(s is UDP) 
    //Drop according to QOS 

    else 
    //Send TCP packets undisturbed 
    return send(s, buf, len, flags); 
} 

回答

1

我想你可以通过使用getsockopt得到插槽类型:

int optVal; 
int optLen = sizeof(int); 

getsockopt(socket, 
      SOL_SOCKET, 
      SO_TYPE, 
      (char*)&optVal, 
      &optLen); 

if(optVal = SOCK_STREAM) 
    printf("This is a TCP socket.\n"); 
else if(optVal = SOCK_DGRAM) 
    printf("This is a UTP socket.\n"); 
else 
    printf("Error"); 
+0

该选项SO_BSP_STATE返回ADDRES,端口和协议的getsockopt文档中找到。谢谢 – 2011-02-04 04:29:25