
C로 소켓 프로그래밍을 구현하려고 합니다. 클라이언트에서 서버(Ubuntu)로 연결하려고 하면 "연결 실패"와 같은 오류가 표시됩니다.
그래서 문제는 포트에 있다고 생각합니다. 소켓 프로그래밍을 위해 5454/tcp 포트를 사용하고 있습니다.
5454 포트가 수신 대기 중인지 여부를 어떻게 알 수 있나요? 그렇지 않다면 Ubuntu에서 C를 사용하여 TCP 소켓 프로그래밍에 사용할 수 있는 포트는 무엇입니까? 포트에만 문제가 있습니까? 아니면 내 코드에 문제가 있거나 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에서 프로그래밍 중이므로 포트가 열려 있는지 여부를 보여주는 작은 조각을 게시할 생각이므로 문자열을 출력하도록 프로그래밍했습니다. 필요에 맞게 쉽게 변경할 수 있습니다.
두 번째 질문에 답하십시오. 여기 있는 모든 사람이 말했듯이, 다른 응용 프로그램에서 해당 포트를 사용하지 않는 경우 시스템의 슈퍼 사용자(루트)인 경우 모든 포트를 거의 사용할 수 있습니다. 루트가 아닌 경우 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 -
이 두 줄은 우리가 포트 22(sshd)에서 수신 대기 중이며 우리가 가지고 있는 모든 인터페이스(예: 네트워크 카드, 이더넷 또는 무선)로부터의 연결을 기꺼이 수락한다는 것을 보여줍니다. 현재 이 포트에 대한 연결이 없습니다.
두 번째 줄은 포트 631에서 CUPS 서버(인쇄용)를 실행하고 있으며 localhost(127.0.0.1) 인터페이스를 통해서만 연결할 수 있음을 보여줍니다.
더 아래로 내려가면 다음 두 줄이 있습니다.
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.