社区
Linux/Unix社区
帖子详情
socket函数在哪个文件定义,
轮子学长
2014-12-30 03:16:40
我想知道socket函数在哪里定义的,具体的实现过程。
比如一些函数可以再/usr/include/中的头文件中找到,但是socket函数却找不到。
那么socket函数执行时,会调用哪些函数呢,求大神指教。
...全文
751
6
打赏
收藏
socket函数在哪个文件定义,
我想知道socket函数在哪里定义的,具体的实现过程。 比如一些函数可以再/usr/include/中的头文件中找到,但是socket函数却找不到。 那么socket函数执行时,会调用哪些函数呢,求大神指教。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
极客代码
2015-01-05
打赏
举报
回复
linux套接字小结
http://www.studyemb.cn/forum.php?mod=viewthread&tid=8&extra=page%3D1
空的
2014-12-31
打赏
举报
回复
我连不上网的时候都这么看的啊
K_THEKING
2014-12-31
打赏
举报
回复
很奇怪man socket 应该是有解说的。。。 头文件包含是
<sys/socket.h>
你没有在/usr/include下找到是因为不在这个目录下,而是在 /usr/include/i38-linux-gnu/sys低下(我ubuntu 13.10) 或者你可以直接用 find / -name sys 查找所有的 sys目录,就一目了然 谢谢
孙
2014-12-31
打赏
举报
回复
socket函数是由glibc提供的,可以在glibc 源代码的include/sys/socket.h文件中找到上述socket函数的声明,这些函数的真正实现比较难找,对于x86体系来说,相关源文件在sysdeps/unix/sysv/linux/i386/socket.S,这是用汇编实现的,用来从用户空间进入名为socketcall的系统调用,并传递参数,下面是相关汇编代码: .globl __socket ENTRY (__socket) #if defined NEED_CANCELLATION && defined CENABLE SINGLE_THREAD_P jne 1f #endif /* Save registers. */ movl %ebx, %edx cfi_register (3, 2) movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ /* Use ## so `socket' is a separate token that might be #define'd. */ movl $P(SOCKOP_,socket), %ebx /* Subcode is first arg to syscall. */ lea 4(%esp), %ecx /* Address of args is 2nd arg. */ /* Do the system call trap. */ ENTER_KERNEL /* Restore registers. */ movl %edx, %ebx cfi_restore (3) /* %eax is < 0 if there was an error. */ cmpl $-125, %eax jae SYSCALL_ERROR_LABEL /* Successful; return the syscall's value. */ L(pseudo_end): ret 注意上面所用的汇编代码采用的是AT&T格式(通常学校所教的是Intel汇编),这是Linux中对x86体系常用的汇编格式。glibc中一般直接采用这种汇编代码来进入内核访问系统调用,而不是_syscalln()格式的宏。 上面代码的作用是进入内核来访问名为socketcall的系统调用,在内核代码中,socketcall系统调用的对应代码在net/socket.c文件中。下面的代码取自Linux内核版本2.26.11: asmlinkage long sys_socketcall(int call, unsigned long __user *args) { unsigned long a[6]; unsigned long a0,a1; int err; if(call<1||call>SYS_RECVMSG) return -EINVAL; /* copy_from_user should be SMP safe. */ if (copy_from_user(a, args, nargs[call])) return -EFAULT; a0=a[0]; a1=a[1]; switch(call) { case SYS_SOCKET: err = sys_socket(a0,a1,a[2]); break; case SYS_BIND: err = sys_bind(a0,(struct sockaddr __user *)a1, a[2]); break; case SYS_CONNECT: err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]); break; case SYS_LISTEN: err = sys_listen(a0,a1); break; case SYS_ACCEPT: err = sys_accept(a0,(struct sockaddr __user *)a1, (int __user *)a[2]); break; case SYS_GETSOCKNAME: err = sys_getsockname(a0,(struct sockaddr __user *)a1, (int __user *)a[2]); break; case SYS_GETPEERNAME: err = sys_getpeername(a0, (struct sockaddr __user *)a1, (int __user *)a[2]); break; case SYS_SOCKETPAIR: err = sys_socketpair(a0,a1, a[2], (int __user *)a[3]); break; case SYS_SEND: err = sys_send(a0, (void __user *)a1, a[2], a[3]); break; case SYS_SENDTO: err = sys_sendto(a0,(void __user *)a1, a[2], a[3], (struct sockaddr __user *)a[4], a[5]); break; case SYS_RECV: err = sys_recv(a0, (void __user *)a1, a[2], a[3]); break; case SYS_RECVFROM: err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3], (struct sockaddr __user *)a[4], (int __user *)a[5]); break; case SYS_SHUTDOWN: err = sys_shutdown(a0,a1); break; case SYS_SETSOCKOPT: err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]); break; case SYS_GETSOCKOPT: err = sys_getsockopt(a0, a1, a[2], (char __user *)a[3], (int __user *)a[4]); break; case SYS_SENDMSG: err = sys_sendmsg(a0, (struct msghdr __user *) a1, a[2]); break; case SYS_RECVMSG: err = sys_recvmsg(a0, (struct msghdr __user *) a1, a[2]); break; default: err = -EINVAL; break; } return err; } 上面的switch/case对应前面socket函数组中的各个函数。这样对于用户空间的一组socket函数,实际上只用到了socketcall一个系统调用,通过不同的参数来进行区分,而进入内核中的实现则可发现,对于不同的参数,由switch/case中不同的case再分别进入不同的内核函数。
轮子学长
2014-12-30
打赏
举报
回复
引用 1 楼 erhou134 的回复:
man socket
似乎没有用
空的
2014-12-30
打赏
举报
回复
man socket
linux下的
socket
在哪个头
文件
,
socket
函数
在哪个
文件
定义
,解决方案
当前位置:我的异常网» Linux/Unix»
socket
函数
在哪个
文件
定义
,解决方案
socket
函数
在哪个
文件
定义
,解决方案www.myexceptions.net网友分享于:2015-01-10浏览:0次
socket
函数
在哪个
文件
定义
,我想知道
socket
函数
在哪里
定义
的,具体的实现过程。比如一些
函数
可以再/usr/include/中的头
文件
中找到,但是
socket
函数
却找不到。那...
【C语言】
socket
函数
在C语言中,
socket
函数
是用于创建网络通信连接中的套接字(
socket
)。这不是一个硬性的规则,但是在正常操作条件下,在调用`
socket
`等
函数
创建新的
文件
描述符时,系统会选择最小的、未被使用的非负
文件
描述符值。
函数
成功创建了一个套接字,它将返回一个非负的套接字描述符(
socket
descriptor),可以用于后续的套接字操作(如连接、绑定、监听等)。所以,在一般程序设计实践中,如果`
socket
`调用成功,返回的
文件
描述符通常不会是0,除非程序已经关闭了标凈输入或其他与之相关的
文件
描述符。
SOCKET
函数
详解
socket
原理 1.
socket
socket
位于应用层和TCP/IP协议通信中间,抽象成一组接口 1.服务端首先初始化
Socket
(),然后和接口进行绑定bind()和监听listen(),然后调用accept()进行阻塞。 2.客户端初始化
socket
(),然后调用connect()与服务端进行连接,然后客户端负责发送请求,服务端接收并且处理请求。write(),read(). 2.
socket
的基本操作 1.
socket
()
函数
int
socket
(int domain, int type, i
socket
()
函数
详解!
函数
原型
socket
()
函数
的原型如下,这个
函数
建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字
文件
描述符。如果
函数
调用成功,会返回一个标识这个套接字的
文件
描述符,失败的时候返回-1。 #include<sys/types.h> #include<sys/
socket
.h> int
socket
(int domain, int......
Socket
函数
详细讲解(
Socket
编程步骤、
socket
函数
、TCP和UDP的区别)
Socket
是一种通信机制,允许在不同主机之间或同一主机的不同进程之间进行数据交换。使用
socket
编程可以实现 TCP 和 UDP 协议的网络通信。特性TCPUDP连接性面向连接(需要三次握手)无连接可靠性可靠传输,保证顺序和完整性不可靠传输,不保证顺序和完整性流量控制有流量控制和拥塞控制无流量控制和拥塞控制传输速度较慢较快头部开销较大(20字节,不包括可选字段)较小(8字节)适用场景需要高可靠性的应用需要高速度的应用。
Linux/Unix社区
23,216
社区成员
74,539
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章