套接字之 getsockname && getpeername
getsockname-获取本地地址;比如,在绑定的时候设置端口号为0由系统自动选择端口绑定,或者使用了INADDR_ANY通配所有地址的情况下,后面需要用到具体的地址和端口,就可以用getsockname获取地址信息;
getpeername-获取建立连接的对端的地址和端口;
下面为源码分析:
/*
* Get the local address ('name') of a socket object. Move the obtained
* name to user space.
*/ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
int __user *, usockaddr_len)
{
struct socket *sock;
struct sockaddr_storage address;
int len, err, fput_needed; /* 查找socket */
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (!sock)
goto out; err = security_socket_getsockname(sock);
if (err)
goto out_put; /* 调用socket操作的getname函数 */
err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, );
if (err)
goto out_put; /* 拷贝地址到用户空间 */
err = move_addr_to_user(&address, len, usockaddr, usockaddr_len); out_put:
fput_light(sock->file, fput_needed);
out:
return err;
}
/*
* Get the remote address ('name') of a socket object. Move the obtained
* name to user space.
*/ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
int __user *, usockaddr_len)
{
struct socket *sock;
struct sockaddr_storage address;
int len, err, fput_needed; /* 查找socket */
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (sock != NULL) {
err = security_socket_getpeername(sock);
if (err) {
fput_light(sock->file, fput_needed);
return err;
} /* 调用socket操作的getname获取对端地址,此时最后一个参数为1 */
err =
sock->ops->getname(sock, (struct sockaddr *)&address, &len,
); /* 将地址拷贝到用户空间 */
if (!err)
err = move_addr_to_user(&address, len, usockaddr,
usockaddr_len);
fput_light(sock->file, fput_needed);
}
return err;
}
ipv4情况下,getsockname和getpeername都会调用下面的inet_getname函数;
/*
* This does both peername and sockname.
*/
int inet_getname(struct socket *sock, struct sockaddr *uaddr,
int *uaddr_len, int peer)
{
struct sock *sk = sock->sk;
struct inet_sock *inet = inet_sk(sk);
DECLARE_SOCKADDR(struct sockaddr_in *, sin, uaddr); /* 设置地址族 */
sin->sin_family = AF_INET; /* 获取对端地址 */
if (peer) {
/* 目的端口为空或者为未连接状态 */
if (!inet->inet_dport ||
((( << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) &&
peer == ))
return -ENOTCONN;
/* 设置目的端口和地址 */
sin->sin_port = inet->inet_dport;
sin->sin_addr.s_addr = inet->inet_daddr;
}
/* 获取本地地址 */
else {
/* 获取接收时ip */
__be32 addr = inet->inet_rcv_saddr; /* 不存在则获取发送时ip */
if (!addr)
addr = inet->inet_saddr; /* 设置端口和地址 */
sin->sin_port = inet->inet_sport;
sin->sin_addr.s_addr = addr;
} /* 填充部分 */
memset(sin->sin_zero, , sizeof(sin->sin_zero)); /* 设置地址长度 */
*uaddr_len = sizeof(*sin);
return ;
}
套接字之 getsockname && getpeername的更多相关文章
- <网络编程>基本TCP套接字编程
tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...
- 17.3.13---socket网络套接字介绍--函数和数据类型
1----Socket类型 套接字格式:socket(family,type[,protocal])使用给定的地址族,套接字类型,协议编号(默认为0)来创建套接字 socket类型 描述 socket ...
- 基本TCP套接字编程
1.listen函数 将主动套接字转换成一个被动套接字 backlog指定相应套接字连接队列的大小. 监听套接字有2个队列: (1)未完成连接队列,接收客户SYN,发出SYN.ACK,等待完成三次握手 ...
- [16]APUE:套接字
[a] socket / socketpair #include <sys/socket.h> int socket(int domain, int type, int protocol) ...
- python套接字基本使用
socket socket通常也称作"套接字",用于描述IP地址和端口,应用程序通常通过"套接字"向网络发出请求或者应答网络请求,可以认为是一种计算机网络的数据 ...
- liunx 套接字编程(Linux_C++)
网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...
- Linux套接字编程
网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...
- Python之socket(套接字)
Socket 一.概述 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- 第十六章:网络IPC:套接字
16.1.引言 上一章考查了各种Unix系统所提供的经典进程间通信(IPC)机制:管道.先进先出.消息队列.信号量以及共享内存.通过这些机制,同一台计算机上运行的进程可以相互通信.本章将考查不同计算机 ...
随机推荐
- MySQL性能优化(一):优化方式
原文:MySQL性能优化(一):优化方式 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/v ...
- Git复习(五)之多人协作、git push失败、git pull失败
多人协作 多人协作时,大家都会往master和dev分支上推送各自的修改. 现在,模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆: $ ...
- Flask-migrate基本使用方法
数据库迁移操作顺序: 1.python 文件 db init 2.根据需求修改模型 3.python flaskapp文件 db migrate -m"新版本名(注释)" 4.py ...
- Delphi 数组与记录类型
- 基于Chromium的浏览器已上线通用“显示密码”按钮
基于Chromium的Edge在日前发布的Canary通道版本中,对用户界面进行了优化调整从而让InPrivate窗口变得更加简洁.在今天获得的版本更新中,微软继续带来了隐私相关的新内容--实现通用的 ...
- CISCO SMARTnet服务和SMB服务技术支持
点击官网:SMB Support Assistant技术支持服务 点击官网:思科SMARTnet快速维护及快速维护现场服务 一.SMARTnet服务 1.1 标准SMARTnet 服务级别:5*8*N ...
- uft 测试工具使用
选择 uft 自带小飞机 cs测试 开始设置 启动插件管理 选择测试 软件类型 cs bs 新建录制项目 各个功能按钮 添加测试程序工作路径 进入录制 保存录制 ...
- detect 导图
https://www.zhihu.com/question/356551927/answer/919612766 知乎上看到的,不错
- JavaScript 的 this 指向问题深度解析
与我们常见的很多语言不同,JavaScript 函数中的 this 指向并不是在函数定义的时候确定的,而是在调用的时候确定的.换句话说,函数的调用方式决定了 this 指向. JavaScript 中 ...
- 免费自动化测试工具Katalon Studio入门
Katalon Studio 一.简介: Katalon Studio 是一个在网页应用.移动和网页服务方面功能强大的自动化测试解决方案.基于 Selenium 和 Appium 框架,Katalon ...