当使用3个终端,2个服务器和1个客户端时,我有以下C_Client代码运行良好 .
但是,当我将同一组代码部署到3台不同的机器时,它没有按预期执行 .
几种情况,
我使用8888端口用于server1和5678端口用于server2 . 输入参数是供客户端输入的 .
-
在同一台机器上连接客户端和服务器 - 使用参数输入按预期工作:
127.0.0.1 127.0.0.1 8888 5678
-
在同一台机器上连接客户机和服务器2,在其他机器上连接server1,它也可以使用参数输入:
192.168.28.116 127.0.0.1 8888 5678
-
有问题的场景,在不同的机器上连接客户端和服务器2,无论我做了什么(例如关闭所有防火墙,检查端口是否收听),显示错误消息: ERROR connecting tpserver:connection refused .
论证输入:
192.168.28.116 192.168.28.117 8888 5678
或
127.0.0.7 192.168.28.117 8888 5678
从2开始,确定服务器1上的同一台机器或不同机器上的连接无关紧要,但是当连接不同机器上的server2时,连接到server1套接字时奇怪地显示错误?为什么?
Client.c
//Variable declaration
int sockfd, sockfd2, portno, portno2, n, a, pid, startonce;
struct sockaddr_in serv_addr, serv_addr2;
struct hostent *server, *server2;
//Opening socket
portno = atoi(argv[3]);
portno2 = atoi(argv[4]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
sockfd2 = socket(AF_INET, SOCK_STREAM, 0);
if ((sockfd < 0) || (sockfd2 < 0)) {
error("ERROR opening socket");
}
server = gethostbyname(argv[1]);
server2 = gethostbyname(argv[2]);
if (server == NULL){
fprintf(stderr, "ERROR, no such host\n");
exit(0);
}
//Serv_addr for tpServer
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) {
error("ERROR connecting tpserver");
}
//Serv_addr for resultServer
bzero((char *) &serv_addr2, sizeof(serv_addr2));
serv_addr2 = serv_addr;
serv_addr2.sin_port = htons(portno2);
if (connect(sockfd2, (struct sockaddr *) &serv_addr2, sizeof(serv_addr2)) < 0) {
error("ERROR connecting resultserver");
}
Server1.c
//Declare variables here
int sockfd, newsockfd, portno, pid;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
if (argc < 2) {
fprintf(stderr, "ERROR, no port provided\n");
exit(1);
}
//Opening socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
error("ERROR opening socket");
}
//Filling info for serv_addr
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
error("ERROR on binding");
}
listen(sockfd,5);
clilen = sizeof(cli_addr);
//Fork when there a successful connection
while (1) {
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
error("ERROR on accept");
}
pid = fork();
if (pid < 0) {
error("ERROR on fork");
}
if (pid == 0) {
close(sockfd);
dostuff(newsockfd);
exit(0);
}
else close(newsockfd);
}
close(sockfd);
return 0;
}
Server2.java
public void startServer(final int portno) {
try {
ServerSocket serverSocket = new ServerSocket(portno);
System.out.println("Waiting for clients to connect...");
while (true) {
try {
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket));
}
catch (IOException e) {
System.err.println("Unable to process client request");
e.printStackTrace();
}
}
}
catch (IOException e) {
System.err.println("Unable to process client request");
e.printStackTrace();
}
}
更新2016/5/17 11:44
我更改了代码:
//Serv_addr for resultServer
bzero((char *) &serv_addr2, sizeof(serv_addr2));
serv_addr2 = serv_addr; //Copied tpServer socket to resultServer info for local testing
serv_addr2.sin_port = htons(portno2);
if (connect(sockfd2, (struct sockaddr *) &serv_addr2, sizeof(serv_addr2)) < 0) {
error("ERROR connecting resultserver");
}
至
//Serv_addr for resultServer
bzero((char *) &serv_addr2, sizeof(serv_addr2));
serv_addr2.sin_family = AF_INET;
bcopy((char *)server2->h_addr, (char *)&serv_addr2.sin_addr.s_addr, server2->h_length);
serv_addr2.sin_port = htons(portno2);
if (connect(sockfd2, (struct sockaddr *) &serv_addr2, sizeof(serv_addr2)) < 0) {
error("ERROR connecting resultserver");
}
但我仍然收到相同的错误消息:
./tp_client 192.168.28.152 192.168.28.130 8888 5678
ERROR connecting tpserver: Connection refused
更新2016/5/17 11:49
我尝试使用另一台Linux机器并成功连接到两台服务器,但是当我在Windows上设置server2时,它仍然显示连接被拒绝 .
所以现在,它适用于3种不同的Linux但不适用于Linux的Windows?我在浏览器的Windows上测试了我的服务器,它就像魅力一样 . 如何将我的Linux客户端连接到Windows服务器?
更新2016/5/18 10:52
新发现,当客户端连接到2台服务器时,2 ips必须是相同的而不是2台不同的服务器机器上,无论是否相同 . 如果它们相同,则 Build 连接,否则连接被拒绝 . 我包含了perror()函数,但仍然得到相同的msg:连接被拒绝,当我在client.c中声明socket时有什么问题吗?
1 回答
所以最后,结果是:不推荐使用gethostbyname方法,并且无法响应请求 . 更新到方法后:getaddrinfo,问题解决了 .
代码现在:
client.c