當使用3個終端, 2個服務器和1個客戶端時,我的C_Client代碼運行良好。錯誤:連接拒絕連接到套接字服務器時
但是,當我將相同的一組代碼部署到3臺不同的機器時,它的性能不如預期。
有幾個方案,
我使用8888端口,用於Server1和5678端口,服務器2。輸入參數用於客戶端輸入。
Connect客戶端和服務器在同一機器 - 按預期方式工作 與申辯後輸入:
127.0.0.1 127.0.0.1 8888 5678
Connect客戶端和Server2上同樣的機器,服務器1的其他機器,它也可以與參數輸入:
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,它是確保在Server1上同一臺機器或不同機器上的連接並不重要,但是當連接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噸不同服務器的機器,不管窗口或not.If他們是一樣的,連接建立,如果沒有,連接被拒絕。我包括perror()函數,但仍然得到相同的味精:連接被拒絕,是否有任何問題,當我在client.c聲明套接字?
你的代碼不能生成列出的錯誤。請改善問題。 – Joshua
對不起,但是你的意思是不能產生列出的錯誤?我認爲錯誤(「錯誤連接tpserver」);會生成msg:ERROR連接tpserver:連接被拒絕。否則,我真的不知道如何跟蹤和修復它。 – PSo
我想這條線發生了,serv_addr2 = serv_addr; ,我會嘗試修復它並報告以查看是否有與此相關的任何內容 – PSo