修复:C++服务器/客户端程序:“连接被拒绝”

问题描述:

我正在写一个简单的程序来将文件从服务器传输到客户端(现在都在同一台计算机上)。使用“telnet 127.0.0.1 [port]”,我可以成功地从服务器获取文件,但是当我运行客户端时,服务器拒绝连接。我怀疑客户正试图连接到错误的地址,但我不确定。如果有帮助,我还添加了一些GDB测试输出。修复:C++服务器/客户端程序:“连接被拒绝”

服务器: “./server 0 4100大文件100 0.01"

int main(int argc, char* argv[]) 
{ 
    int sockfd; 
    if(!(sockfd = socket(AF_INET, SOCK_STREAM, 0))) { 
     error("Failed to create socket"); 
    } 

    struct sockaddr_in serv_addr, cl_addr; 
    bzero((void*) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(atoi(argv[2])); 
    if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { 
     error("Failed to bind"); 
    } 
    listen(sockfd, 10); 

    int fd = open(argv[3], O_RDONLY); 
    int bufsize = atoi(argv[4]); 
    int packet_period = atoi(argv[5]); 
    size_t cl_addr_len = sizeof(cl_addr); 
    char *buf = new char[bufsize]; 
    while(true) { 
     int sd; 
     cout << "waiting for client..." << endl; 
     if(!(sd = accept(sockfd, (struct sockaddr *) &cl_addr, (socklen_t*) &cl_addr_len))) { 
      error("Failed to acccept"); 
     } 
     cout << "Accepted client connection" << endl; 
     lseek(fd, 0, SEEK_SET); 
     while(int n = read(fd, buf, bufsize)) { 
      cout << "Transferring " << buf << endl; 
      usleep(100000); 
      write(sd, buf, n); 
     } 
    } 
} 

客户:” ./client 0 127.0.0.1 4100大文件统计”

int main(int argc, char *argv[]) 
{ 
    int sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) { 
     error("Failed to open socket"); 
    } 

    struct sockaddr_in serv_addr; 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = inet_addr(argv[2]); 
    serv_addr.sin_port = htons(atoi(argv[3])); // I tried both htons and htonl 
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) { 
     error("Failed to connect"); 
    } 

    int n; 
    char buf[256]; 
    int fd = open(argv[4], O_RDONLY); 
    while((n = read(sockfd, buf, 256)) > 0) { 
     printf("Received: %s\n", buf); 
     write(fd, buf, n); 
    } 

    close(fd); 
    close(sockfd); 
    return 0; 
} 

GDB输出:

(gdb) r 
Starting program: [...]/client 0 127.0.0.1 4100 bigfile stats 

Breakpoint 1, main (argc=6, argv=0x7fffffffde68) at client.cpp:31 
31  if (connect(sockfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { 

(gdb) p serv_addr 
$1 = {sin_family = 2, sin_port = 0, sin_addr = {s_addr = 16777343}, 
    sin_zero = "\000\000\000\000\000\000\000"} 
+0

如果你不能确定与地址,试图嗅出我正在使用Wireshark – 2015-03-02 22:49:03

+0

连接在我的电脑上 - 地址必须是127.0.0.1和端口4100,因为我可以使用“telnet 127.0.0.1 4100” – user1299784 2015-03-02 23:16:06

{sin_family = 2, sin_port = 0, sin_addr = {s_addr = 16777343}, sin_zero = "\000\000\000\000\000\000\000"} 

因此sin_port是错误的:它不应该是零。代码设置它是:

serv_addr.sin_port = htonl(atoi(argv[3])); 

问题在这里。它应该是

serv_addr.sin_port = htons(atoi(argv[3])); 

不是今天的问题,但

printf("Received: %s\n", buf); 

应该

printf("Received: %.*s\n", n, buf); 
+0

连接谢谢。它现在有效。 – user1299784 2015-03-03 00:02:32