我有一个用C编写的非常简单的服务器和一个用Java编写的同样简单的客户端。当我在同一台计算机上运行它们时一切正常,但是当我尝试在计算机A和计算机B上的客户端上运行服务器时,我从java客户端收到错误 IOException connection refused 。我似乎无法找出发生的事情,有什么想法吗?我甚至关闭了防火墙,但问题仍然存在。
服务器。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 3557
#define BUF 256
int main(int argc, char *argv[])
{
struct sockaddr_in host, remote;
int host_fd, remote_fd;
int size = sizeof(struct sockaddr);;
char data[BUF];
host.sin_family = AF_INET;
host.sin_addr.s_addr = htonl(INADDR_ANY);
host.sin_port = htons(PORT);
memset(&host.sin_zero, 0, sizeof(host.sin_zero));
host_fd = socket(AF_INET, SOCK_STREAM, 0);
if(host_fd == -1) {
printf("socket error %d\n", host_fd);
return 1;
}
if(bind(host_fd, (struct sockaddr *)&host, size)) {
printf("bind error\n");
return 1;
}
if(listen(host_fd, 5)) {
printf("listen error");
return 1;
}
printf("Server setup, waiting for connection...\n");
remote_fd = accept(host_fd, (struct sockaddr *)&remote, &size);
printf("connection made\n");
int read = recv(remote_fd, data, BUF, 0);
data[read] = '\0';
printf("read = %d, data = %s\n", read, data);
shutdown(remote_fd, SHUT_RDWR);
close(remote_fd);
return 0;
}
客户端。
import java.net.*;
import java.io.*;
public class socket {
public static void main(String[] argv) {
DataOutputStream os = null;
try {
Socket socket = new Socket("192.168.1.103", 3557);
os = new DataOutputStream(socket.getOutputStream());
os.writeBytes("phone 12");
os.close();
socket.close();
} catch (UnknownHostException e) {
System.out.println("Unkonw exception " + e.getMessage());
} catch (IOException e) {
System.out.println("IOException caught " + e.getMessage());
}
}
}
修改
感谢大家的快速反应(我很震惊)。由于使用telnet和nc的建议,我解决了这个问题。我发现我的防火墙阻塞了服务器计算机上的端口3557。我应该想到一个简单的事情,谢谢!
答案 0 :(得分:2)
有许多可能的问题,你应该开始并尝试查明有问题的部分。
这可能是一个网络问题 - 由于防火墙等原因,B可能无法连接到A.
要检查这一点,您可以从A上的B运行端口扫描开始(nmap -p 3557 192.168.1.103
检查端口是否对计算机B开放)。
如果它看起来是开放的,您可以尝试从B而不是客户端连接telnet / nc以查看服务器是否按预期工作:telnet 192.168.1.103 3557
或nc 192.168.1.103 3557
并且一旦连接写入“phone 12”看看你得到了什么。
这些应该可以帮助您了解导致问题的部分,服务器,客户端或网络。
答案 1 :(得分:0)
嗯,首先要做的是相信错误信息:如果你得到“拒绝连接”,则假设另一端拒绝连接。那么问题是为什么?
几乎总是,事实证明这是一个简单的“愚蠢的错误”。在深入了解之前,请检查:
假设所有这些都有效,那么使用 telnet(1)尝试连接到服务器。如果它能够工作,telnet应该能够读取另一端。
推荐实际上有两个参数,主机和端口:
$ telnet 192.168.1.103 3557
应该连接到 机器上的服务器,当然还有
$ telnet localhost 3557
应该在服务器端系统上运行。
如果程序只要你在同一个系统上工作,而不是远程工作,你就会遇到某种路由或防火墙问题。 (确保您没有“智能”开关尝试限制防火墙正在执行的操作之外的某些端口。)
如果程序无法在同一系统上运行,请确保服务器正在等待I / O,并尝试使用telnet技巧。如果服务器没有停止等待I / O,请阅读库调用标志的手册页。没有人记得他们所有人;其中一些有你不会注意到的神秘副作用。
如果服务器停止等待I / O并且telnet将无法连接,则添加一些printfs以确保它按计划进行。特别是,看看accept
和recv
的返回值 - 如果你有一个不行为的程序,并且你没有测试所有的回报代码,你可以打赌(毫无疑问,这是墨菲定律之一),你没有测试的一个电话是失败的。
如果您可以通过 telnet 连接并成功输入数据,请转到Java。尝试将os
设为FileOutputStream
并查看它是否符合您的预期。