2017-09-26 52 views
-1

我在Ubuntu中创建了服务器套接字,而在Windows中创建了客户端套接字,但连接在服务器上被拒绝。 它说:“拒绝连接”。 我使用的是Ubuntu 16.04 LTS和Windows 10. 这两个套接字都是用C编写的。 我使用“Linux GCC”在Eclipse中运行服务器套接字代码(在Ubuntu上运行)。 我使用“Cygwin GCC”和Gnu Make Builder编译Eclipse中的客户端套接字代码(在Windows上运行)。 服务器的IP地址192.168.1.21 和客户端的IP地址192.168.1.20无法在Ubuntu和Windows之间连接TCP套接字

请检查下面的代码片段:

服务器插槽:

//to run this program in the terminal I enter one argument, 
//the port to listen to, 34550. 

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

void error(char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 

int main(int argc, char *argv[]) 
{ 
    char* register_emergency = "register emergency"; 
    int sockfd, newsockfd, portno, clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1); 
    } 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = atoi(argv[1]); //usually 34550 
    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); 
    while(1){ 
     printf("now waiting for a new connection...\n"); //this appears on server's screen to me. 
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 
    //on the "accept" function the control flow waits and holds for a connection 
    //As far as it goes for the server, it keeps waiting here and doesn't react... As if it doesn't see any incoming connection 
    if (newsockfd < 0) { 
     error("ERROR on accept"); 
    } else { 
     bzero(buffer,256); 
     n = read(newsockfd, buffer, 255); 
     if (n < 0) error("ERROR reading from socket"); 
     printf("Here is the message I got from Mr. Client: '%s'\n",buffer); 

     struct sockaddr_in *s = (struct sockaddr_in *) &cli_addr; 
     char ipstr[INET6_ADDRSTRLEN]; 
     inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeofipstr); 
     printf("The IP of the client: %s\n", ipstr); 
     printf("The port of the sender: %d\n",ntohs(s->sin_port)); 
     if (strcmp(register_emergency, buffer) == 0){ 

     } 

     n = write(newsockfd, "Hey Mr. Client, this is server talking...", 18); 
     if (n < 0) error("ERROR writing to socket"); 

     } 
    } 
} 

现在客户端运行在Windows上:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

void error(char *msg) 
{ 
    perror(msg); 
    exit(0); 
} 

//In the command prompt, I enter 2 arguments 
//192.168.1.21 34550 

int main(int argc, char *argv[]) 
{ 
    int sockfd, portno, n; 

    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    char buffer[256]; 
    if (argc < 3) { 
     fprintf(stderr,"usage %s hostname port\n", argv[0]); 
     exit(0); 
    } 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    serv_addr.sin_port = htons(portno); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = inet_addr("192.168.1.21");   
    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
     error("ERROR connecting"); //program flow always enters here... then perror returns "Connection refused" 
    printf("Please enter the message: "); 
    bzero(buffer,256); 
    fgets(buffer,255,stdin); 
    n = write(sockfd,buffer,strlen(buffer)); 
    if (n < 0) 
     error("ERROR writing to socket"); 
    bzero(buffer,256); 
    n = read(sockfd,buffer,255); 
    if (n < 0) 
     error("ERROR reading from socket"); 
    printf("%s\n",buffer); 
    return 0; 
} 

我尝试了另一个端口,但它没有工作。 我试图颠倒两台机器上的客户端和服务器,但连接再次被拒绝。

我检查了Wireshark中的数据包,从服务器生成的数据包总是Seck = 1,Ack = 1,但Rst = 1,所以它不是导致问题的路由器。 并且两台机器上的防火墙均关闭。

+0

请通过https://help.ubuntu.com/stable/ubuntu-help/net-firewall-on-off.html和* *暂时关闭您的Ubuntu机器上的防火墙,并再次测试以检查防火墙是否是您的问题。 – nos

+0

如果您在同一台机器上编译服务器和客户端并尝试在“127.0.0.1”上连接,会发生什么情况? –

+0

我想你忘了在客户端代码中分配'portno'。 –

回答

2

你忘了这条线在您的客户端代码

portno = atoi(argv[2]);