Problemas com a função ntohs [RESOLVIDO]

1. Problemas com a função ntohs [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/10/2018 - 22:15h

Olá, estou tendo problemas para converter network byte order para host byte order com a função ntohs(). Eu não entendi o porque da conversão está dando problemas, pois a função que estou usando para converter host byte order para network byte order é a htons(), o que tecnicamente deveria dar certo, pois ambas as funções trabalham com unsigned short.

Eis o código onde faço o uso da função ntohs():


#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void){

struct sockaddr_in addr, remoteAddr;
socklen_t socklen=sizeof(struct sockaddr_in);

int sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sockfd<0){

perror("ERROR (SOCKET)");

exit(1);
}

addr.sin_family=AF_INET;
addr.sin_port=htons(9009);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");

if(bind(sockfd, (const struct sockaddr*)&addr, socklen)<0){

perror("ERROR (BIND)");

exit(1);
}

if(listen(sockfd, 1)<0){

perror("ERROR (LISTEN)");

exit(1);
}

int csockfd=accept(sockfd, (struct sockaddr*)&remoteAddr, &socklen);

if(csockfd<0){

perror("ERROR (BIND)");

}else{

printf("\nConnected successfully with %s:%hu\n\n",
inet_ntoa(remoteAddr.sin_addr), ntohs(remoteAddr.sin_port));

if(send(csockfd, "REAL MOTHERFUCKIN G'S", 22, 1)<0){

perror("ERROR (SEND)");
}
}

close(csockfd);
close(sockfd);

return 0;
}


Execução do "programa" (se é que é possível chamar essa porcaria acima de programa):

Servidor

Zhokhaidooo@Zhokhaidooo:~/Desktop/PrograshitoPpkX$ gcc -Wall server.c -o server
Zhokhaidooo@Zhokhaidooo:~/Desktop/PrograshitoPpkX$ ./server

Connected successfully with 127.0.0.1:42798


Cliente:

Zhokhaidooo@Zhokhaidooo:~/Desktop/PrograshitoPpkX$ nc 127.0.0.1 9009
REAL MOTHERFUCKIN G'S


Observer a menssagem exibida pelo servidor: "Connected successfully with 127.0.0.1:42798".
Agora observer que a porta exibida na menssagem é 42798 ao invés de 9009.

AGUEM ME EXPLICA O QUE ESTÁ ACONTECENDO?
_____________________________________________
"When the singularity collapses, I will be far away from here. In another universe, as a matter of fact. You, on the other hand, will be destroyed in every way it is possible to be destroyed, and even in some which are essentially impossible. " - Wallace Breen to Gordon Freeman in Half-Life 2


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 15/10/2018 - 23:49h

Na ponta do cliente (nc, não o seu programa), a porta dinamicamente alocada para o socket foi provavelmente a porta 42798. Numa próxima execução possivelmente será uma coisa diferente, já que a alocação dinâmica de portas depende da estratégia do sistema operacional.

Seu programa pega a informação da ponta remota da conexão (porque, embora esteja na mesma máquina, se refere a um canal de comunicação indicado por outro descritor, em outro processo). Se você quiser ver o mesmo valor de porta que o do socket que você criou, em lugar de usar o valor preenchido de remoteAddr, você pode usar algo parecido com o seguinte.

struct sockaddr_in localSinAddr;
socklen_t localAddrLen=sizeof localSinAddr;
if(getsockname(csockfd, (struct sockaddr *)&localSinAddr, &localAddrLen)!=-1){
/* Trata informações preenchidas em localSinAddr e localAddrLen */
}






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts