加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

谁在C中连接Socket

发布时间:2020-12-13 18:57:06 所属栏目:Linux 来源:网络整理
导读:我正在编写一些客户端/服务器风格的程序.现在我正在开发服务器端,我打开一个套接字. 但是,我需要知道谁在我的插座中连接.什么IP连接.因为我需要输入在服务器上连接的日志. 所以,我的问题是如何在C中执行此操作?使用Linux. 我尝试使用getsockopt()但不起作用

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

但是,我需要知道谁在我的插座中连接.什么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作为参数:

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读