从 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 位数长。
一直在处理连接到系统上的服务器 运行 的要求。我有 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 位数长。