我有一些C代码运行在MS Windows上,我正在编译/链接与微软编译器. 代码打开一个套接字并连接到远程服务器.
我想编写一些代码来确定我的开放套接字正在使用哪个Windows网络适配器. 我可以使用Microsoft的GetAdaptersDDL函数列出系统中的所有网络适配器. 在我的系统中,列出了12个适配器. 我想写一些C代码来确定哪一个适配器承载了我的开放套接字的通信.
下面是一些工作示例代码,它演示了一个连接的套接字并枚举了网络适配器. 我在Google搜索了一些示例C代码,以确定哪个网络适配器与我的套接字相关联,但没有结果. 谢谢你能提供的任何帮助.
#include <winsock2.h>
#include <ws2tcpip.h>
#include <io.h>
#include <Iphlpapi.h>
#pragma comment(lib,"WS2_32.lib")
#pragma comment(lib,"IPHLPAPI.lib")
#include <stdio.h>
#include <stdlib.h>
static void enumAdapters();
int main(int argc,char *argv[])
{
WORD ver = MAKEWORD(2,2);
WSADATA wsa;
int sockfd;
struct sockaddr_in addr;
WSAStartup(ver,&wsa);
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
fprintf(stderr,"Failed socket\n");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
if (inet_pton(AF_INET,"142.250.65.238",&addr.sin_addr) < 0) {
fprintf(stderr,"Failed inet_pton\n");
exit(1);
}
if (connect(sockfd,(const struct sockaddr *)&addr,sizeof(addr)) < 0) {
fprintf(stderr,"Failed connect\n");
exit(1);
}
printf("Which of these adapters is my connected socket using?\n\n");
enumAdapters();
close(sockfd);
exit(0);
}
static void enumAdapters()
{
IP_ADAPTER_ADDRESSES _dummy,*ptr,*buf=&_dummy;
ULONG bufsize=0;
GetAdaptersAddresses(AF_INET,0,NULL,buf,&bufsize);
buf = (IP_ADAPTER_ADDRESSES *)malloc(bufsize);
if (GetAdaptersAddresses(AF_INET,0,NULL,buf,&bufsize) != NO_ERROR) {
fprintf(stderr,"Failed to get adapters\n");
return;
}
for (ptr=buf; ptr!=NULL; ptr=ptr->Next) {
printf("Adapter #%d %s\n",(int)ptr->IfIndex,ptr->AdapterName);
printf(" %wS (%wS)\n",ptr->FriendlyName,ptr->Description);
}
free(buf);
return;
}