gpt4 book ai didi

c - Windows 工作站不可知设置广播客户端的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 08:45:43 24 4
gpt4 key购买 nike

我一直在尝试制作一个用于简单 LAN 通信的广播客户端,并且我已经制作了一个相当简单的客户端和服务器,带有基本的数据序列化接口(interface)。我一直无法弄清楚如何为我正在使用的任何工作站获取“定向广播”地址,以便我可以设置聊天。我是网络新手,所以我在这方面没有太多经验。我试着查找例子,但我发现的大多数都不是我想要的。环回地址一切正常,广播是我目前唯一的问题区域。

我从Beej's tutorial学到了基本思想它简要解释了广播数据包的确切含义以及一些陷阱,如防火墙、网络负载,以及一些不太明显的陷阱。然后我通过一个更面向 winsock 的站点增强了这方面的知识,Winsock's Programmer's FAQ ,这使得它与像我这样的 Windows 特定程序更相关。

虽然我理解广播背后的想法,但我无法以与工作站无关的方式修改程序并从客户端向服务器广播数据包。从我读过的几个 SO 问题和前面提到的 Winsock 常见问题解答中,我还发现“获取本地 IP 地址”的想法并不完全是黑白的。由于用户可能有几种不同的网络方式或可以使用不同的地址。这是困扰我如何妥善处理的主要问题。

我当前用来包装此行为的函数是这样的:

extern void WINAPI setup_connection( connection_data * data )
{
char host_name[128] = { 0 };

struct in_addr host_address;
struct in_addr broadcast_address;

if ( gethostname( &host_name[0], sizeof( host_name ) ) == HOST_NOT_FOUND )
{
winsock_error( "Getting host name", WSAGetLastError( ), FALSE );
destroy_winsock_data( data );
exit( 1 );
}

if ( !( data->host_info = gethostbyname( &host_name[0] ) ) )
{
winsock_error( "Getting host by name", WSAGetLastError( ), FALSE );
destroy_winsock_data( data );
exit( 1 );
}

host_address = *( ( struct in_addr * )data->host_info->h_addr );
broadcast_address.S_un.S_addr = ( host_address.S_un.S_addr & NETMASK ) | ( ~( NETMASK ) );

data->broadcast_address.sin_family = AF_INET;
data->broadcast_address.sin_port = htons( PORT );
data->broadcast_address.sin_addr = broadcast_address;

return;
}

主机名似乎是正确的,但 gethostbyname 显然返回了一个垃圾值。如果我尝试检索返回的 IP 地址,它会显示“地址无效”。尽管出于某种原因,发送调用不会出错,但据我所知,数据包从未发送过。

如果您想知道,我将套接字设置为像这样广播:

extern int WINAPI set_socket_to_broadcast( int socket, BOOL setting )
{
char broadcast = ( setting ? '1' : '0' );

if ( setsockopt( socket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof( char ) ) == SOCKET_ERROR )
{
winsock_error( "Setting Broadcast", WSAGetLastError( ), FALSE );
return -1;
}

return 0;
}

如果您想知道我的 connection_data 结构是什么,我是这样声明的:

typedef struct connection_data
{
struct sockaddr_in broadcast_address;
struct hostent * host_info;

int socket;
} connection_data;

如果您需要更多详细信息,我可能会在明天检查并再次发布。

最佳答案

这里的主要错误是网络掩码不是常量,它是您可以检索的接口(interface)属性。

关于c - Windows 工作站不可知设置广播客户端的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com