2016-05-17 244 views
0

當使用3個終端, 2個服務器和1個客戶端時,我的C_Client代碼運行良好。錯誤:連接拒絕連接到套接字服務器時

但是,當我將相同的一組代碼部署到3臺不同的機器時,它的性能不如預期。

有幾個方案,

我使用8888端口,用於Server1和5678端口,服務器2。輸入參數用於客戶端輸入。

  1. Connect客戶端和服務器在同一機器 - 按預期方式工作 與申辯後輸入:127.0.0.1 127.0.0.1 8888 5678

  2. Connect客戶端和Server2上同樣的機器,服務器1的其他機器,它也可以與參數輸入:192.168.28.116 127.0.0.1 8888 5678

  3. 有問題的情況下,連接在不同機器上的客戶端和服務器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聲明套接字?

+1

你的代碼不能生成列出的錯誤。請改善問題。 – Joshua

+0

對不起,但是你的意思是不能產生列出的錯誤?我認爲錯誤(「錯誤連接tpserver」);會生成msg:ERROR連接tpserver:連接被拒絕。否則,我真的不知道如何跟蹤和修復它。 – PSo

+0

我想這條線發生了,serv_addr2 = serv_addr; ,我會嘗試修復它並報告以查看是否有與此相關的任何內容 – PSo

回答

0

最後,事實證明,方法:gethostbyname已被棄用,並且無法響應請求。更新到方法getaddrinfo後,問題解決了。

此刻的代碼:

client.c

int sockfd, sockfd2; 
struct addrinfo hints, *servinfo, *p; 
struct addrinfo hints2, *servinfo2, *p2; 
int rv, rv2; 
//Opening socket 
memset(&hints, 0, sizeof(hints)); 
memset(&hints2, 0, sizeof(hints2)); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 
hints2.ai_family = AF_UNSPEC; 
hints2.ai_socktype = SOCK_STREAM; 

if ((rv = getaddrinfo(argv[1], argv[3], &hints, &servinfo)) != 0) { 
    fprintf(stderr, "tpgetaddrinfo: %s\n", gai_strerror(rv)); 
exit(1); 
} 

if ((rv2 = getaddrinfo(argv[2], argv[4], &hints2, &servinfo2)) != 0) { 
fprintf(stderr, "rsgetaddrinfo: %s\n", gai_strerror(rv2)); 
exit(1); 
} 

for (p = servinfo; p != NULL; p = p->ai_next) { 
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { 
    perror("tpsocket"); 
    continue; 
} 

if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { 
    perror("tpconnect"); 
    close(sockfd); 
    continue; 
} 

break; 
} 

for (p2 = servinfo2; p2 != NULL; p2 = p2->ai_next) { 
if ((sockfd2 = socket(p2->ai_family, p2->ai_socktype, p2->ai_protocol)) == -1) { 
    perror("rssocket"); 
    continue; 
} 

if (connect(sockfd2, p2->ai_addr, p2->ai_addrlen) == -1) { 
    perror("rsconnect"); 
    close(sockfd2); 
    continue; 
} 

break; 
} 

if (p == NULL) { 
fprintf(stderr, "failed to connect tpserver\n"); 
exit(2); 
} 

if (p2 == NULL) { 
fprintf(stderr, "failed to connect rsserver\n"); 
exit(2); 
} 

freeaddrinfo(servinfo); 
freeaddrinfo(servinfo2); 
相關問題