Linux

如何判斷 TCP 埠是否打開?

  • October 1, 2013

我正在嘗試在 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,它正在工作。謝謝大家。

由於您正在使用 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;
}

引用自:https://unix.stackexchange.com/questions/92608