Eu tenho dois programas C em execução em computadores separados e estou tendo problemas para enviar pacotes UDP de uma máquina para outra. Eu testei os pedaços de código de comunicação cliente / servidor na mesma máquina usando um localhost, e tudo parecia bem, então eu não acho que o problema está no meu código. O programa do servidor está sendo executado em um laptop Ubuntu e o programa cliente está sendo executado em uma área de trabalho do Windows XP. No momento, eu simplesmente os conecto por meio de um roteador Linksys wrt54gs.
Toda vez que tento conectar, recebo o erro "Não é possível resolver o endereço" 10.0.24.100 "" do PC cliente ao tentar estabelecer uma conexão. (Eu posso fornecer algum código, se alguém acha que vai ajudar.) Ele também está me dando o código de erro do Windows 11004.
"The requested name is valid and was found in the database, but it does not have the correct associated data being resolved for. The usual example for this is a host name-to-address translation attempt (using gethostbyname or WSAAsyncGetHostByName) which uses the DNS (Domain Name Server). An MX record is returned but no A record—indicating the host itself exists, but is not directly reachable."
Eu não tenho ideia de como remediar isso. No entanto, o PC host está me dando uma mensagem de sucesso para enviar dados. (Isso é porque é UDP?)
Acho que o problema está relacionado à minha falta de experiência em rede. Esta é a primeira vez que tento enviar dados UDP em C, e tenho certeza de que o cliente não pode ver o servidor porque não fiz algo certo nas configurações em algum lugar. Eu sou novo em redes Linux, então não tenho certeza de como garantir que o cliente possa ver meu servidor no linux.
Até agora, eu tentei dois roteadores diferentes sem sucesso. Os LEDs acendem quando eu conecto os cabos Ethernet. Eu realmente não tenho certeza do que mais eu preciso fazer com o roteador para facilitar
esta comunicação. Como posso ter certeza de que as duas máquinas podem se ver? Eu tenho que mudar o IP do roteador / computadores? Como eu iria fazer isso? Eu acho que há algo básico que sinto falta aqui. Qualquer ajuda seria muito apreciada.
UPDATE
Este é o código do cliente UDP:
int argc;
char **argv;
#define DEFAULT_PORT 61003
#define DEFAULT_PROTO SOCK_DGRAM
...
int UDPTrack(int argc, char **argv)
{
short pan1, tilt1;
char c = 'l';
char Buffer[128];
//server hardcoded in
char *server_name= "10.0.24.100";
unsigned short port = DEFAULT_PORT;
int retval, loopflag = 0;
int i, loopcount, maxloop=-1;
unsigned int addr;
int socket_type = DEFAULT_PROTO;
struct sockaddr_in server;
struct hostent *hp;
WSADATA wsaData;
SOCKET conn_socket;
//radar data struct
struct RadarData
{
unsigned int messageID : 32;
unsigned int time : 32;
float az;
float el;
};
struct RadarData receivedData;
if (argc >1)
{
for(i=1; i<argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch(tolower(argv[i][1]))
{
case 'p':
if (!stricmp(argv[i+1], "TCP"))
socket_type = SOCK_STREAM;
else if (!stricmp(argv[i+1], "UDP"))
socket_type = SOCK_DGRAM;
else
Usage(argv[0]);
i++;
break;
case 'n':
server_name = argv[++i];
break;
case 'e':
port = atoi(argv[++i]);
break;
case 'l':
loopflag =1;
if (argv[i+1]) {
if (argv[i+1][0] != '-')
maxloop = atoi(argv[i+1]);
}
else
maxloop = -1;
i++;
break;
default:
Usage(argv[0]);
break;
}
}
else
Usage(argv[0]);
}
}
if ((retval = WSAStartup(0x202, &wsaData)) != 0)
{
fprintf(stderr,"Client: WSAStartup() failed with error %d\n", retval);
WSACleanup();
return -1;
}
else
printf("Client: WSAStartup() is OK.\n");
//ERROR HAPPENS SOMEWHERE IN HERE
if (port == 0)
{
Usage(argv[0]);
}
// Attempt to detect if we should call gethostbyname() or gethostbyaddr()
if (isalpha(server_name[0]))
{ // server address is a name
hp = gethostbyname(server_name);
}
else
{ // Convert nnn.nnn address to a usable one
addr = inet_addr(server_name);
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
}
if (hp == NULL )
{
fprintf(stderr,"Client: Cannot resolve address \"%s\": Error %d\n", server_name, WSAGetLastError());
WSACleanup();
system("Pause");
exit(1);
}
else
printf("Client: gethostbyaddr() is OK.\n");
Eu nunca consigo passar por aqui.