accept获取对端IP地址,getsockname获取本端IP地址

本文详细介绍了getsockname和getpeername函数在TCP/IP编程中的应用,通过服务端和客户端代码示例,解释了如何使用这两个函数获取本地和远程套接字地址。同时,展示了内核态下如何实现类似功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:https://blog.youkuaiyun.com/ma2595162349/article/details/78726916?utm_source=blogxgwz9

getpeername函数用于获取与某个套接字关联的外地地址,accept函数在接收连接的时候也会获取对端的地址。getsockname用于获取本端的地址。看代码。

服务端:

 

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
 
int main()
{
    int sockSrv = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addrSrv;
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_addr.s_addr =htonl(INADDR_ANY);
    addrSrv.sin_port = htons(8888);
 
    bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
    listen(sockSrv, 5);
 
    struct sockaddr_in addrClient;
    socklen_t len = sizeof(struct sockaddr_in);
 
    int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, &len);
    printf("ip=%s\n",inet_ntoa(addrClient.sin_addr));
    printf("port=%d\n",ntohs(addrClient.sin_port));
 
    getchar();
    close(sockConn);
    close(sockSrv);
 
    return 0;
}

 

客户端:

 

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <error.h>
 
int main()
{
     int ret=0;
     int sockClient = socket(AF_INET, SOCK_STREAM, 0);
 
     struct sockaddr_in addrSrv;
     addrSrv.sin_addr.s_addr=inet_addr("127.0.0.1");
     addrSrv.sin_family = AF_INET;
     addrSrv.sin_port = htons(8888);
     ret=connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));
 
     struct sockaddr_in addrClient;
     socklen_t len=sizeof(addrClient);
 
     getsockname(sockClient,(struct sockaddr *)&addrClient,&len);
     printf("ip=%s\n",inet_ntoa(addrClient.sin_addr));
     printf("port=%d\n",ntohs(addrClient.sin_port));
 
     getchar();
     close(sockClient);
 
     return 0;
}

 

在内核态

可以这样写:

struct socket * tnfs_socket_create(void)
{
        struct socket * sock;

        int ret 	= 0;
		struct timeval timeout = {3,0};

        sock = (struct socket *)kmalloc(sizeof(struct socket),GFP_KERNEL);

        if(sock == NULL)
        {
                tnfs_print("client : sock kmalloc error");
                return sock;
        }

        // ret = sock_create_kern(&init_net,AF_INET,SOCK_STREAM,0,&sock);
  	    ret = sock_create_kern(AF_INET,SOCK_STREAM,0,&sock);
        if(ret < 0)
        {
            tnfs_print("clinet : sock create error: %d \n",ret);
		    //tnfs_socket_release(sock);
        }else{
            tnfs_print("client : sock create ok!\n");
			kernel_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO,(const char*)&timeout,sizeof(timeout));
			kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(const char*)&timeout,sizeof(timeout));
			
			struct sockaddr_in addrClient;
			int len=sizeof(addrClient);
 
			kernel_getsockname(sock,(struct sockaddr *)&addrClient,&len);
			//tnfs_print("ip=%s\n",inet_ntoa(addrClient.sin_addr));
			tnfs_print("port=%d\n",ntohs(addrClient.sin_port));

        }
		
        return sock;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值