【问题标题】:Extracting last 4 characters from a string in C从C中的字符串中提取最后4个字符
【发布时间】:2021-05-29 18:16:00
【问题描述】:

一直在处理连接到系统上运行的服务器的要求。我有 2 台主机,主机 A 和主机 B。 主机 A("hostname: o755-gksr") 包含两台服务器,分别运行在端口 4840 和 4841。运行在端口 4840 的服务器启用了 mDNS 并为网络发布数据包。 我在主机 B 上运行在 4840 的服务器。它也启用了 mDNS。现在,当从主机 B 运行客户端 API 时,它将检查网络上公布的所有服务器并获取服务器列表中的信息。 现在,在此 API 之上,我尝试单独连接到每个服务器(以检查服务器是否仍在网络故障时运行)。 我能够提取主机名并计算 IP 并尝试连接到它。 但我无法提取端口信息。 例如:如果 URL 是opc.tcp://o755-gksr:4840,我想提取字符数组或整数中的端口信息.. 非常感谢您的指导。

    printf("--Checking for network connectivity--\n");
    for (size_t i = 0; i < serverOnNetworkSize; i++) {
        UA_ServerOnNetwork *server = &serverOnNetwork[i];
        A[i] = (char *)UA_malloc(server->discoveryUrl.length + 1);
        memcpy(A[i], server->discoveryUrl.data, server->discoveryUrl.length);
        A[i][server->discoveryUrl.length] = 0;
        int length = strlen(A[i]);  //URL is of the form A[1] = "opc.tcp://o755-gksr:4840"
        //removing the port and extracting hostname to find IP
        A[i][length - 5] = '\0';
        //without initial tcp binding
        B[i] = A[i] + 10;
        // printf("Hostname: %s\n", B[i]);
        if (i != 0) { //because i=0 will be the server running on the same machine
            char ip_address[50];
            find_ip_address(B[i], ip_address);       
            socketCommunication(ip_address, B[i]);   ///,&B[i]);
        }
    }

寻找IP:

int find_ip_address(char *hostname, char *ip_address) {
    struct hostent *host_name;
    struct in_addr **ipaddress;
    int count;

    if ((host_name = gethostbyname(hostname)) == NULL) {
        herror("\nIP Address Not Found\n");
        return 1;
    } else {
        ipaddress = (struct in_addr **)host_name->h_addr_list;
        for (count = 0; ipaddress[count] != NULL; count++) {
            strcpy(ip_address, inet_ntoa(*ipaddress[count]));
            return 0;
        }
    }
    return 1;
}

套接字通信:

void socketCommunication(char *ip_address, char *hostname) {
    int clientSocket, ret;
    struct  sockaddr_in serverAddr;
    char buffer[1024];
 
    clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (clientSocket < 0) {
        printf("Error in connection \n");
        exit(1);
    }

    //printf("Client socket is created\n");

    memset(&serverAddr, '\0', sizeof(serverAddr));
    // printf("MEMSET DONE\n");

    serverAddr.sin_port = htons(4844);
    //printf("PORT DONE\n");
    serverAddr.sin_family = AF_INET;
    //printf("afnet DONE\n");
    serverAddr.sin_addr.s_addr = inet_addr(ip_address);

    //printf("%s\n", *ip_address);

    //printf("Config done: \n");

    ret = connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
    if (ret < 0) {
        printf("LOOKS LIKE NETWORK CONNECTION HAS FAILED. HAVE A LOOK AT THE NETWORK CONNECTIVITY at host : %s\n",hostname);
        printf("----Updated Status Information----:\n");
        printf("\tHostname :%s\n", hostname);
        printf("\tStatus:CONNECTON TIMED OUT");
        //exit(1);
    }
    //printf("Connected to Server\n");
}

目前我正在对套接字通信中的端口进行硬编码。请指导我从 URL 中提取端口信息,以便我可以将其作为参数传递给函数,以动态分配端口给套接字通信。

【问题讨论】:

  • C 字符串只是一个字符数组。获取数组大小,并使用偏移量来获取最后一个字符。请记住,一个端口最多可以有 5 个数字。即使您当前的应用程序仅使用 4 位端口,您也应该实现一种使用所有 5 位数字的方法。顺便说一句,我很确定已经有一个标准库可以为您完成所有这些工作。至少我记得我上次编写服务器时使用了一个库。

标签: c sockets tcp


【解决方案1】:

您很可能想要使用像 strrchr(const char *, int c) 这样的函数。这将搜索最后一次出现的字符并返回一个指向它的指针。

您可以搜索冒号,然后使用指针复制最后 4 个字符或使用 strtol 之类的函数将字符转换为整数。

char *p = strrchr(input_buffer, ':');
unsigned long port = strtoul(p+1, NULL, 10);

您也可以使用strlen 来获取字符串的长度并使用结尾作为您的偏移量,但是我相信端口在 0...65535 范围内?所以你最有可能使用第一个选项会更好,除非你知道它总是 4 位数长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多