[英]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.