从 C 中的字符串中提取最后 4 个字符

Extracting last 4 characters from a string in C

一直在处理连接到系统上的服务器 运行 的要求。我有 2 个主机,主机 A 和主机 B。 主机 A(“主机名:o755-gksr”)在端口 4840 和 4841 包含两个服务器 运行。端口 4840 上的服务器 运行 启用了 mDNS 并为网络通告数据包。 我在主机 B 上的 4840 有一台服务器 运行。它也启用了 mDNS。现在当运行来自Host 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] = '[=10=]';
        //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, '[=12=]', 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 中提取端口信息,以便我可以将其作为参数传递给函数以动态分配端口给套接字通信。

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

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

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

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