Я пытаюсь реализовать программирование сокетов на языке C. Когда я пытаюсь подключиться с клиента к серверу (Ubuntu), появляется ошибка типа «сбой подключения».
Так что я думаю, что проблема в порте. Я использую порт 5454/tcp для программирования сокетов.
Как узнать, прослушивается ли порт 5454 или нет? Если нет, то какие порты я могу использовать для программирования сокетов TCP с помощью C в Ubuntu? Это проблема только с портом или что-то не так в моем коде или требуются какие-то настройки в LINUX Ubuntu?
РЕДАКТИРОВАТЬ: Фрагмент кода:
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);
РЕДАКТИРОВАТЬ: Проблема в порте, поэтому я просто переустановил Ubuntu, и все работает. Спасибо вам всем.
решение1
Поскольку вы программируете в CI, я подумал о том, чтобы разместить небольшой фрагмент, который показывает, открыт порт или нет, я запрограммировал вывод строки. Вы можете легко изменить его в соответствии с вашими потребностями.
Ответ на ваш второй вопрос, как все здесь сказали, вы можете использовать практически любой порт, если вы являетесь суперпользователем (root) в системе, если порт не используется никаким другим приложением. Если вы не root, то вы можете открыть любой порт выше 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;
}
решение2
Есть несколько способов, наиболее распространенными из которых, вероятно, являются:
# netstat -ltun
Конечно, можно использовать и grep
другие (регулярные) выражения.
Если вы используете разные машины (клиент и сервер), вам iptables
также необходимо проверить.
Вы можете использовать практически любой порт, который в данный момент не используется для ваших программ. Однако проверьте /etc/services
известные и зарезервированные порты.
решение3
Проверьте ссылку(http://wi-fizzle.com/article/458) для TCP-порта открыт или нет
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
решение4
Лучшим инструментом для попытки определить, привязан ли процесс к порту TCP, является netstat
. Вы можете запустить его так, чтобы получить список имен привязанных процессов, если таковые имеются, а также все соединения с портом и их состояние.
Пример
$ 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
Выше показаны локально открытые порты в третьем столбце и удаленные порты, к которым мы готовы принимать подключения, например, в этих двух строках:
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 -
Эти 2 строки показывают, что мы прослушиваем порт 22 (sshd) и готовы принимать соединения с любого имеющегося у нас интерфейса (т. е. любая сетевая карта, ethernet или беспроводная). В настоящее время к этому порту нет соединений.
Вторая строка показывает, что мы запускаем сервер CUPS (для печати) на порту 631, и мы можем подключиться к нему только через интерфейс localhost (127.0.0.1).
Далее у нас есть эти 2 строки:
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
Которые показывают, что мы получаем доступ к веб-сайту по IP-адресу 198.252.206.25. Мы знаем, что это веб-сайт, потому что мы получаем доступ к этому серверу через порт 80 (HTTP). Также, если мы посмотрим IP-адрес, мы найдем это:
$ dig -x 198.252.206.25 +short
stackoverflow.com.