我正在编写一些客户端/服务器风格的程序.现在我正在开发服务器端,我打开一个套接字.
但是,我需要知道谁在我的插座中连接.什么IP连接.因为我需要输入在服务器上连接的日志.
所以,我的问题是如何在C中执行此操作?使用Linux.
我尝试使用getsockopt()但不起作用.我是网络编程的新手.
有人知道我该怎么办?
这是我的socket的代码:
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,sizeof (sock.server));
/** E tambem no buffer */
memset(sock.buff,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,sizeof (sock.buff));
sleep(1);
}
}
return INIT_SOCKET_SUCCESS;
}
感谢帮助!
最佳答案
如果传递地址,accept()调用将为您提供远程地址
结构sockaddr作为参数:
结构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,NI_NUMERICHOST);