Estou tentando implementar a programação de soquete em C. Quando tento conectar de um cliente a um servidor (Ubuntu), aparece um erro como "falha na conexão".
Então acho que o problema está na porta. Estou usando a porta 5454/tcp para programação de soquete.
Como posso saber se a porta 5454 está escutando ou não? Se não for, quais são as portas que posso usar para programação de soquete TCP usando C no Ubuntu? Esse é o problema apenas com a porta ou há algo errado no meu código ou alguma configuração é necessária no LINUX Ubuntu?
EDITAR: Trecho de código:
int socket_send;
struct sockaddr_in address;
printf("\n Initialization Socket....");
socket_send = socket(AF_INET,SOCK_STREAM,0);
if(socket_send == -1)
{
perror("\n Socket not created.Error:");
return 1;
}
printf("\n Socket created");
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(5454);
if(connect(socket_send,(struct sockaddr*)&address,sizeof(struct sockaddr))<0)
{
perror("\nConnetion failed.Error:");
return 1;
}
printf("\n Connected");
if(send(socket_send,(char*)buffer,size,flag)<0)
{
perror("\nSending failed.Error:");
return 1;
}
printf("\n Data successfully sent");
close(socket_send);
EDITAR: O problema está na porta, então acabei de reinstalar o Ubuntu e está funcionando. Obrigado, todos vocês.
Responder1
Como você está programando em CI pensei em postar um pequeno trecho que mostra se a porta está aberta ou não, programei para gerar uma string. Você pode alterá-lo facilmente para atender às suas necessidades.
Responda à sua segunda pergunta, como todos aqui disseram, você pode usar praticamente qualquer porta se for o superusuário (root) do sistema, se a porta não for usada por nenhum outro aplicativo. Se você não for o root, poderá abrir qualquer porta acima de 1024.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
int portno = 5454;
char *hostname = "192.168.56.101";
int sockfd;
struct sockaddr_in serv_addr;
struct hostent *server;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
error("ERROR opening socket");
}
server = gethostbyname(hostname);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
printf("Port is closed");
} else {
printf("Port is active");
}
close(sockfd);
return 0;
}
Responder2
Existem várias maneiras, sendo provavelmente a mais comum:
# netstat -ltun
Você pode, é claro, grep
para outra expressão (regular).
iptables
Se você estiver usando máquinas diferentes (cliente e servidor), também será necessário verificar .
Você pode usar praticamente qualquer porta que não esteja sendo usada atualmente para seus programas. Verifique, entretanto, /etc/services
as portas conhecidas e reservadas.
Responder3
Verifique o link (http://wi-fizzle.com/article/458) para a porta TCP está aberta ou não
nc -z <host_or_ip> <port> 1>/dev/null 2>&1; result=$?;
if [ $result -eq 0 ]; then
echo 'the port is open for tcp connections'
else
echo 'the port was closed'
fi
Responder4
A melhor ferramenta para tentar determinar se um processo está vinculado a uma porta TCP é netstat
. Você pode executá-lo dessa forma para obter uma lista do nome do processo vinculado, se houver, bem como quaisquer conexões com a porta, bem como seu estado.
Exemplo
$ netstat -tapn | head -15
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:49006 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:17500 0.0.0.0:* LISTEN 3516/dropbox
tcp 0 0 0.0.0.0:17501 0.0.0.0:* LISTEN 3517/dropbox
tcp 0 0 0.0.0.0:2143 0.0.0.0:* LISTEN 4383/ssh
tcp 0 0 127.0.0.1:1986 0.0.0.0:* LISTEN 2757/mono
tcp 0 0 0.0.0.0:2025 0.0.0.0:* LISTEN 4383/ssh
tcp 0 0 192.168.1.20:58285 198.252.206.25:80 TIME_WAIT -
tcp 0 0 192.168.1.20:58188 198.252.206.25:80 ESTABLISHED 3830/chrome --purge
tcp 0 0 192.168.1.20:58286 198.252.206.25:80 TIME_WAIT -
tcp 0 0 192.168.1.20:54000 174.37.23.130:6667 ESTABLISHED 2696/pidgin
A imagem acima mostra as portas abertas localmente na terceira coluna e as portas remotas às quais estamos dispostos a aceitar conexões, como estas 2 linhas:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
Estas 2 linhas mostram que estamos escutando na porta 22, (sshd) e estamos dispostos a aceitar conexões de qualquer interface que tivermos (ou seja, qualquer placa de rede, Ethernet ou wireless). Atualmente não há conexões com esta porta.
A 2ª linha mostra que estamos executando o servidor CUPS (para impressão) na porta 631, e só podemos nos conectar a ele através da interface localhost (127.0.0.1).
Mais abaixo temos estas 2 linhas:
tcp 0 0 192.168.1.20:58285 198.252.206.25:80 TIME_WAIT -
tcp 0 0 192.168.1.20:58188 198.252.206.25:80 ESTABLISHED 3830/chrome --purge
O que mostra que estamos acessando um site no endereço IP 198.252.206.25. Sabemos que é um site porque estamos acessando este servidor pela porta 80 (HTTP). Além disso, se procurarmos o endereço IP, encontraremos o seguinte:
$ dig -x 198.252.206.25 +short
stackoverflow.com.