c - unix 套接字 - 无法连接到服务器(连接超时)

标签 c sockets unix network-programming ip

我尝试基于 UNIX 网络套接字创建简单的客户端/服务器程序。

有服务器代码

/* Headers */
#include "common/service.h"
#include "net/protocol.h"

int main(int argc, char** argv) {

    /* Setting up socket */
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    $( sock < 0, "socket", NULL );

    struct sockaddr_in srv_address, cli_address;

    memset((char *) &srv_address, 0, sizeof(srv_address));
    srv_address.sin_family = AF_INET;
    srv_address.sin_addr.s_addr = INADDR_ANY;
    srv_address.sin_port = htons(RKP_RL_DEFAULT_PORT);

    $(
        bind(sock, (struct sockaddr*) &srv_address, sizeof(srv_address)) < 0,
        "bind", NULL
    );
    /* Listening */
    listen(sock, 1);
    /* Accepting */
    int ca_len = sizeof(cli_address);
    int cli_sock = accept( sock, (struct sockaddr*) &cli_address, &ca_len );
    $( cli_sock < 0, "accept", NULL );
    /* Processing */
    char accept_buffer[RKP_BUFFER_SZ] = {0};
    read( cli_sock, accept_buffer, RKP_BUFFER_SZ-1 );
    printf( "Incoming message: %s", accept_buffer );
    write( cli_sock, "OK", 3 );

    close(cli_sock);
    close(sock);

    return 0;

}

客户端代码

/* Headers */
#include "common/service.h"
#include "net/protocol.h"

int main(int argc, char** argv) {

    $( argc != 2, argv[0], "Wrong syntax" );
    // argv[1] contains server address

    int port = RKP_RL_DEFAULT_PORT;
    int sock = socket( AF_INET, SOCK_STREAM, 0 );
    $( sock < 0, "socket", NULL );  

    struct hostent* server;
    server = gethostbyname(argv[1]);
    $( server == NULL, "gethostbyname", "Host %s not found", argv[1] ); 

    struct sockaddr_in srv_address;
    memset( (char*) &srv_address, 0, sizeof(srv_address) );
    srv_address.sin_family = AF_INET;
    strncpy( (char*) &srv_address.sin_addr.s_addr, (char*) server->h_addr_list[0], server->h_length);
    srv_address.sin_port = htons(port); 

    $( connect(sock, &srv_address, sizeof(srv_address)) < 0, "connect", NULL ); 

    char accept_buffer[RKP_BUFFER_SZ];
    memset( accept_buffer, 0, RKP_BUFFER_SZ );  

    printf("Enter message\n");
    fgets( accept_buffer, RKP_BUFFER_SZ-1, stdin );
    write( sock, accept_buffer, strlen(accept_buffer) );

    memset( accept_buffer, 0, RKP_BUFFER_SZ );
    read( sock, accept_buffer, RKP_BUFFER_SZ-1 );

    printf( "Server answer: %s\n", accept_buffer );

    close(sock);

    return 0;

}

然后我使用参数 127.0.0.1localhost192.168.0.1 启动服务器和客户端。两个程序都使用端口 6662。几秒钟后直到开始我得到错误:

connect: Connection timed out

我该如何解决?

最佳答案

引用这一行:

strncpy( (char*) &srv_address.sin_addr.s_addr, (char*) server->h_addr_list[0], server->h_length);

strncpy()适用于 0-终止的 char-数组,C-“字符串”。因为你想复制二进制数据使用 memcpy()相反。

memcpy(&srv_address.sin_addr.s_addr, server->h_addr_list[0], server->h_length);

此外,如果不是在 Windows 或一些旧的 UNIX 上,这一行

int ca_len = sizeof(cli_address);

应该是

socklen_t ca_len = sizeof(cli_address);

确定 accept() 的第三个参数的类型你想查阅你的文档吗?

关于c - unix 套接字 - 无法连接到服务器(连接超时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32124226/

相关文章:

c - 在命令行参数中使用螺旋规则

java - 如何确定平衡或完美平衡的二叉搜索树(仅来自图片)

linux - TCP/IP : set socket option for keep-alive after connection has been established

c - gtk。我怎样才能通过id获取小部件?

linux - 编写一个命令,列出实际设置的唯一值(记住,名称/值对)(即忽略注释行)

c - 使用 Switch case 删除 C 中字符串中的标点符号

c - 带有指向 C 结构的指针的 S4 对象

asp.net - .NET 中的 Tcp/Ip 套接字连接

使用 TCP/IP 套接字检查有多少数据已传送到目的地

bash - Unix:从 .dat 文件中提取数据并插入 SQL 数据库?