
我正在嘗試用 C 語言實現套接字編程。
所以我認為問題出在連接埠。我使用 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 中編程,想要發布一個小片段來顯示連接埠是否打開,因此我已編程輸出一個字串。您可以輕鬆更改它以滿足您的需求。
回答你的第二個問題,就像這裡每個人所說的那樣,如果你是系統上的超級用戶(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 -
這兩行表示我們正在偵聽連接埠 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.