谁在C中连接Socket

谁在C中连接Socket,第1张

概述我正在编写一些客户端/服务器风格的程序.现在我正在开发服务器端,我打开一个套接字.但是,我需要知道谁在我的插座中连接.什么IP连接.因为我需要输入在服务器上连接的日志.所以,我的问题是如何在C中执行此 *** 作?使用Linux.我尝试使用getsockopt()但不起作用.我是网络编程的新手.有人知道我该怎么办?这是我的socket的代码:int init_soc

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

但是,我需要知道谁在我的插座中连接.什么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);
总结

以上是内存溢出为你收集整理的谁在C中连接Socket全部内容,希望文章能够帮你解决谁在C中连接Socket所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/1046562.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存