谁在C中连接Socket

前端之家收集整理的这篇文章主要介绍了谁在C中连接Socket前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

但是,我需要知道谁在我的插座中连接.什么IP连接.因为我需要输入在服务器上连接的日志.

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

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

有人知道我该怎么办?

这是我的socket的代码

  1. int init_socket() {
  2. /** Declara um socket */
  3. Socket sock;
  4. /** Inicia o socket */
  5. sock.socket = socket(AF_INET,SOCK_STREAM,0);
  6. /** Seta zeros no sockaddr */
  7. memset(&sock.server,sizeof (sock.server));
  8. /** E tambem no buffer */
  9. memset(sock.buff,sizeof (sock.buff));
  10. /** Seta os valores do sockaddr */
  11. sock.server.sin_family = AF_INET;
  12. sock.server.sin_addr.s_addr = htonl(INADDR_ANY);
  13. //sock.server.sin_port = htons(get_config_int(&conf,"monitor_port"));
  14. sock.server.sin_port = htons(2200);
  15. /** Chama o bind */
  16. bind(sock.socket,(struct sockaddr*) &sock.server,sizeof (sock.server));
  17. /*
  18. * É um socket blocante,então espera encher o buffer
  19. * Faz o listen
  20. */
  21. if (listen(sock.socket,2) == -1) {
  22. /** Deu falha na preparação para o accept,insere nos logs */
  23. insert_log(FATAL,LOG_KERNEL,"Não foi possível iniciar o socket - event.c");
  24. /** Retorna falha */
  25. return INIT_SOCKET_Failed;
  26. }
  27. /** Se chegar aqui,faz o accept,dentro de um loop infinito */
  28. connect:
  29. while ((sock.conn = accept(sock.socket,(struct sockaddr*) NULL,NULL))) {
  30. printf("Recebi uma conexão,começando comunicação...\n");
  31. /** Agora conn é um file descriptor,podemos ler e gravar nele */
  32. while (1) {
  33. if (read(sock.conn,sock.buff,sizeof (sock.buff)) == 0) {
  34. close(sock.conn);
  35. printf("Pronto para outra conexão...\n");
  36. goto connect;
  37. }
  38. printf("Eu Li isso do Buffer: %s",sock.buff);
  39. /** Limpa o buffer */
  40. memset(sock.buff,sizeof (sock.buff));
  41. sleep(1);
  42. }
  43. }
  44. return INIT_SOCKET_SUCCESS;
  45. }

感谢帮助!

最佳答案
如果传递地址,accept()调用将为您提供远程地址
结构sockaddr作为参数:

  1. struct sockaddr_storage remoteAddr;
  2. socklen_t remoteAddrLen = sizeof(remoteAddr);
  3. sock.conn = accept(sock.socket,(struct sockaddr *)&remoteAddr,&remoteAddrLen);

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

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

猜你在找的Linux相关文章