【问题标题】:Unix server client Connect: Connection refusedUnix服务器客户端连接:连接被拒绝
【发布时间】:2016-04-06 05:23:48
【问题描述】:

我在使用套接字创建我的第一个服务器客户端应用程序时遇到了一些问题。我已将服务器的套接字地址硬编码为 localhost,并将端口硬编码为 55555。当我尝试在单独的终端中键入命令 ./player localhost 55555 从客户端连接到它时,服务器没有任何反应。我认为应该发生的是服务器接收到“Rock”的数据,然后打印“Client: ready.\nGo\n Client: Rock”。相反,服务器继续等待,对玩家没有反应。我怀疑我实际上并没有连接到服务器,所以我尝试将套接字地址“localhost”硬编码到播放器连接中,以及 55555 的端口(也是硬编码的)。我尝试运行命令 ./player 并显示“连接:连接被拒绝”。我想知道如何修复我的硬编码 player.c

referee.c(这是服务器)

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

int main(int argc, const char* argv[])
{
    char buf[1024];
    struct sockaddr_in localhost;
    int listenSock, serviceSock, bytesRead;
    size_t len = sizeof(localhost);
    int port = 55555;
    listenSock = socket(AF_INET, SOCK_STREAM, 0);
    if (listenSock<0) {
        perror("Socket");
        exit(1);
    }
    bzero((char*)&localhost, len);
    localhost.sin_family = AF_INET;
    localhost.sin_addr.s_addr = htonl(INADDR_ANY);
    localhost.sin_port = htons(port);
    bind(listenSock, (struct sockaddr*) &localhost, len);
    printf("Paper, Scissors, Rock game start.\nWaiting for player...\n");
    listen(listenSock, 5);
    do {
        serviceSock = accept(listenSock, 0, 0);
        if(serviceSock == -1){
            perror("Accept");
        }
        else do {
            bzero(buf, sizeof(buf));
            if((bytesRead = read(serviceSock, buf, 1024))<0) {
                perror("Read");
            }
            if(bytesRead > 0){
                printf("Client: ready.\nGo\n    Client: %s\n", buf);
            }
        } while (bytesRead != 0);
        close(serviceSock);
    } while(1);
}

player.c(客户端)

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    int sock;
    struct sockaddr_in server;
    struct hostent *hp;
    char buf[1024], *data = "Rock";
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        perror("Socket");
        exit(1);
    }
    server.sin_family = AF_INET;
    hp = gethostbyname(argv[1]);
    if (hp == 0) {
        fprintf( stderr, "%s: unknown host", argv[1] );
        exit(1);
    }
    bcopy( hp->h_addr, &server.sin_addr, hp->h_length );

    server.sin_port = htons(atoi(argv[2]));
    if(connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
        perror("Connect");
        exit(1);
    }
    if(write(sock, data, strlen(data)) < 0) {
        perror("Write");
    }
    close(sock);
}

带有硬编码地址/端口的 player.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    int sock;
    struct sockaddr_in server;
    struct hostent *hp;
    char buf[1024], *data = "Rock";
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        perror("Socket");
        exit(1);
    }
    server.sin_family = AF_INET;
    hp = gethostbyname("localhost");
    if (hp == 0) {
        fprintf( stderr, "%s: unknown host", argv[1] );
        exit(1);
    }
    bcopy( hp->h_addr, &server.sin_addr, hp->h_length );

    server.sin_port = 55555;
    if(connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
        perror("Connect");
        exit(1);
    }
    if(write(sock, data, strlen(data)) < 0) {
        perror("Write");
    }
    close(sock);
}

【问题讨论】:

  • 您需要检查bind()listen()的结果是否有错误。

标签: c linux sockets unix connect


【解决方案1】:

这是错误的:

server.sin_port = 55555;

应该是:

server.sin_port = htons(55555);

【讨论】:

  • 顺便说一句,如果您想要一种简单的方法来验证您的服务器是否实际上正在侦听端口 55555,您可以尝试在服务器运行时从另一个 shell 窗口执行“telnet 127.0.0.1 55555”。如果 telnet 抱怨“连接被拒绝”,那么无论出于何种原因,您的服务器实际上都没有在该端口上侦听。
  • 我得到了 telnet 127.0.0.1 55555 Trying 127.0.0.1... 连接到 127.0.0.1。转义字符是 '^]'。连接被外部主机关闭。
  • 我将 server.sin_port 更改为 server.sin_port = htons(55555);还有我的 hp = gethostname("localhost");我改为 hp = gethostname("127.0.0.1");它仍然无法正常工作
【解决方案2】:

变化

 server.sin_port = 55555;

到:

server.sin_port = htons(55555);

正在工作。

【讨论】:

  • 我试过这个,但同样的事情发生了。您是否让服务器打印“客户端:准备就绪。\nGo\n 客户端:Rock”行。我还在 referee.c 中对我的 bind() 进行了测试,它似乎返回 -1。所以我认为错误现在在绑定中
  • yes.bind() 对我来说工作正常。执行 ps -e 以查看之前是否正在运行相同的进程。
  • 我的输出是这样的: bind : Success Paper, Scissors, Rock game start。等待播放器... 听 :: Success Client: 准备好了。 Go 客户端:Rock
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多