【发布时间】: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 位数字的方法。顺便说一句,我很确定已经有一个标准库可以为您完成所有这些工作。至少我记得我上次编写服务器时使用了一个库。