我正在尝试用 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 中编程,想要发布一个小片段来显示端口是否打开,因此我已编程输出一个字符串。您可以轻松更改它以满足您的需要。
回答你的第二个问题,就像这里每个人所说的那样,如果你是系统上的超级用户(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.