我正在尝试连接从两个不同函数返回的两个值,即服务器IP地址和学生ID。用于获取这些函数的函数是void函数,以便访问服务器。我想使用strcat()
函数,但我不能让它成功运行。以下代码成功返回服务器中的两个单值。
void get_ipaddress(void)
{
int fd;
struct ifreq ifr;
printf("IP Address:");
fd = socket(AF_INET, SOCK_DGRAM, 0);
/* I want to get an IPv4 IP address */
ifr.ifr_addr.sa_family = AF_INET;
/* I want an IP address attached to "eth0" */
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
close(fd);
/* Display result */
printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
}
void get_studentid(int socket)
{
char studentid[32];
size_t k;
readn(socket, (unsigned char *) &k, sizeof(size_t));
readn(socket, (unsigned char *) studentid, k);
printf("Student ID: %s\n", studentid);
} // end get_studentid()
我正在尝试获取输出
192.168.229.128:S1427722
我之前尝试的任何代码都返回了错误
无效使用void表达式
答案 0 :(得分:1)
你的函数get_ipaddress
应该是malloc并返回一个IPv4地址,或者给一个字符串/ char []来填充。所以你可以把它改成:
void get_ipaddress(char *addr, int n)
{
/* ... */
// Copy the string into our buffer
strncpy(addr, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr), n);
}
get_studentid
应该是相同的:
void get_studentid(int socket, char *studentid, int n)
{
size_t k;
unsigned char *buf;
readn(socket, (unsigned char *) &k, sizeof(size_t));
buf = malloc(k);
readn(socket, buf, k);
strncpy(studentid, buf, n);
free(buf);
} // end get_studentid()
现在你可以做到:
int main(void) {
char s_id[32] = {0};
char ipaddr[32] = {0};
char output[64] = {0};
int sock;
// Call the functions
get_ipaddress(ipaddr, 32);
// Open your socket here
get_studentid(sock, s_id, 32);
// Format the output
snprintf(output, 64, "%s: %s", ipaddr, s_id);
// Print the result
printf("%s\n", output);
}
这利用了sprintf(),它被格式化打印成字符串,为此至少它比strcat好,因为对于strcat,你需要连接两次(“:”和studentid)。