簡體   English   中英

如何使用C創建TCP套接字連接到預定義的端口

[英]How to Create a TCP socket connect using C to a predefined port

我有一個非常簡單的問題。 我想測試一個特定端口當前是否正在使用。 為此,我想將TCP套接字綁定到端口,如果連接被拒絕意味着端口正在使用,如果不是,則意味着端口是空閑的。

有人可以告訴我如何在C中編寫TCP套接字代碼? 我在solaris平台上。

我知道它非常基本。 但我感謝你的幫助。 提前致謝。

如果出現錯誤,對bind函數的調用將返回-1。 這包括地址已被使用的情況。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 12345

int main()
{
  struct sockaddr_in addr;
  int fd;

  fd = socket(AF_INET, SOCK_STREAM, 0);
  if(fd == -1)
  {
      printf("Error opening socket\n");
      return -1;
  }

  addr.sin_port = htons(PORT);
  addr.sin_addr.s_addr = 0;
  addr.sin_addr.s_addr = INADDR_ANY;
  addr.sin_family = AF_INET;

  if(bind(fd, (struct sockaddr *)&addr,sizeof(struct sockaddr_in) ) == -1)
  {
      printf("Error binding socket\n");
      return -1;
  }

  printf("Successfully bound to port %u\n", PORT);
}

這取決於你要測試的確切內容。

以joelc建議的方式使用bind()將告訴您端口是否在計算機上的任何接口上打開。 雖然要徹底,但您不僅要檢查bind()的返回值,還要檢查errno == EADDRINUSE

即。 (修改joelc的代碼)


if(bind(socket, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) ) == -1)
{
    if( errno == EADDRINUSE )
    {
        // handle port already open case
    }
    else
    {
        // handle other errors
    }
}

通過更改行中使用的地址:例如。


    sin.sin_addr.s_addr = inet_addr("192.168.1.1");

...您可以測試特定接口上的端口是否可用。

請注意,這不是對端口狀態的完美測試。 如果另一個進程打開端口並在它正常關閉端口之前終止(即在調用套接字上的close()之前),那么通常會得到相同的EADDRINUSE錯誤。 (取決於是否在套接字上設置了SO_REUSEADDR選項)

(旁注:除非您的測試應用程序以足夠的權限運行,否則您將無法綁定()到1024以下的任何端口)

正如Anonymous建議的那樣,您還可以查看netstat 這將為您提供所有相同的信息,您可以通過反復調用bind()更快速並且沒有任何副作用(例如它不必實際綁定到端口,這將使它們無法使用其他過程)。 只需調用netstat -a --numeric-ports -t並分析輸出就可以為您提供所需的一切。

關於moogs建議的評論 - 在每個端口上調用telnet只會告訴你套接字是否正在偵聽該端口 - 而不是它是否實際打開。

您是否只想測試特定端口當前是否正在使用? (並且不需要制作程序)。 如果是這樣,您可以使用telnet:

telnet主機端口

如果連接失敗,則表示未使用。 如果它連接並等待你的輸入,它正在使用:)

您可能想查看netstat的源代碼。 我相信Solaris中也有一個netstat。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM