gpt4 book ai didi

c - 谁在 C 的 Socket 上连接

转载 作者:IT王子 更新时间:2023-10-29 00:32:31 27 4
gpt4 key购买 nike

我正在编写一些客户端/服务器风格的程序。现在我正在开发服务器端,我打开了一个套接字。

但是,我需要知道我的套接字中连接了谁。连接的是什么IP。因为我需要输入连接到服务器的日志。

所以,我的问题是如何在 C 中执行此操作?使用 Linux。

我尝试使用 getsockopt() 但不起作用。我是网络编程的新手。

有人知道我该怎么做吗?

这是我的套接字代码:

int init_socket() {
/** Declara um socket */
Socket sock;

/** Inicia o socket */
sock.socket = socket(AF_INET, SOCK_STREAM, 0);

/** Seta zeros no sockaddr */
memset(&sock.server, 0, sizeof (sock.server));

/** E tambem no buffer */
memset(sock.buff, 0, sizeof (sock.buff));

/** Seta os valores do sockaddr */
sock.server.sin_family = AF_INET;
sock.server.sin_addr.s_addr = htonl(INADDR_ANY);
//sock.server.sin_port = htons(get_config_int(&conf, "monitor_port"));
sock.server.sin_port = htons(2200);

/** Chama o bind */
bind(sock.socket, (struct sockaddr*) &sock.server, sizeof (sock.server));

/*
* É um socket blocante, então espera encher o buffer
* Faz o listen
*/
if (listen(sock.socket, 2) == -1) {
/** Deu falha na preparação para o accept, insere nos logs */
insert_log(FATAL, LOG_KERNEL, "Não foi possível iniciar o socket - event.c");

/** Retorna falha */
return INIT_SOCKET_FAILED;
}

/** Se chegar aqui, faz o accept, dentro de um loop infinito */
connect:
while ((sock.conn = accept(sock.socket, (struct sockaddr*) NULL, NULL))) {
printf("Recebi uma conexão, começando comunicação...\n");
/** Agora conn é um file descriptor, podemos ler e gravar nele */
while (1) {
if (read(sock.conn, sock.buff, sizeof (sock.buff)) == 0) {
close(sock.conn);
printf("Pronto para outra conexão...\n");
goto connect;
}
printf("Eu Li isso do Buffer: %s", sock.buff);

/** Limpa o buffer */
memset(sock.buff, 0, sizeof (sock.buff));
sleep(1);
}
}

return INIT_SOCKET_SUCCESS;
}

感谢您的帮助!

最佳答案

如果您传递地址,accept() 调用会为您提供远程地址struct sockaddr 作为参数:

struct sockaddr_storage remoteAddr;
socklen_t remoteAddrLen = sizeof(remoteAddr);

sock.conn = accept(sock.socket, (struct sockaddr *)&remoteAddr, &remoteAddrLen);

然后您可以使用 getnameinfo() 将远程地址转换为字符串,这适用于 IPv4 和 IPv6:

char host[NI_MAXHOST];
getnameinfo((struct sockaddr *)&remoteAddr, remoteAddrLen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);

关于c - 谁在 C 的 Socket 上连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20621049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com