Linux Socket学习--域和套接口简介

简介:

       套接口创建后,就如同一个文件描述符,我们可以使用同样的IO函数进行读写,关闭操作。其实,和引用一个已经打开的文件一样,套接口也是通过文件描述符来引用的,而且两者的文件描述符共享一个“数字空间”,比如说不能既打开一个文件描述符为4的套接口,又打开一个文件描述符为4的文件。

       套接口和已经打开的文件的区别:

       1.不能在套接口上调用函数lseek()当然对于管道也不能调用这个函数。

       2.套接口可以和网络地址关联,但是文件和管道却不可以。

       3.套接口有很多可以通过ioctl()进行查询和设置的选项。

       4.套接口必须在正确的状态写才能进行输入输出,但是已经打开的文件可以在任何的时候进行读写操作。

       调用open()函数打开一个新文件,Linux内核会返回一个当前系统可用的最小的文件描述符。比如如果关闭了标准输入(文件描述符0),又立即打开一个新文件,那么新文件的文件描述符就是0.

        另外要注意的是Linux内核在分配文件描述符的时候,并不区分这个描述符是分配给套接口还是给已经打开的文件的。      

        我们知道,使用int pipe(int fileds[2]);函数可以创建管道,如果这个函数调用成功,内核会返回两个文件描述符,fileds[0]表示管道读出端的文件描述符,fileds[1]表示管道写入端的文件描述符。所以可以看出管道是单向的,任何的反方向操作会导致错误。

        但是套接口不同,他可以进行双向通信。这个也是他和管道的根本差异。

       创建一个套接口使用以下的函数:

 

#include <sys/types.h>
#include <sys/socket.h>

int socketpair(int domain,int type,int protocol,int sv[2]);

 

下面我们来展示一个socketpair的例子:

 

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    int state;
    int s[2];

    state=socketpair(AF_LOCAL,SOCK_STREAM,0,s);
    if (state== -1)
    {
    	fprintf(stderr, "an error %s has happend.\n", strerror(errno);
    	return 1;
    }

    printf("s[0]=%d\n", s[0]);
    printf("s[1]=%d\n", s[1]);
    

	return 0;
}

 

    其中AF_LOCAL套接口又被称为是unix套接口,所以使用AF_UNIX和使用AF_LOCAL都是一样的。不过建议使用AF_LOCAL。

    下面我们来展示一下使用套接口实现I/O

    ………………UNDONE(此处代码待添加)

     我们来看看如何关闭套接口

     当我们从管道读取输入的时候,读取进程受到文件结束标识以后就知道没有后续文件了,因为文件描述符是由写进程关闭管道的写段的时候发送的。套接口的关闭类似,当在套接口发送端关闭后,接受端就会受到文件结束标识,但是这种关闭方式不适用所有的情况。close终止了数据传送的两个方向:读和写,由于TCP是全双工的,在很多的情况下,本地进程要通知远程端点已经完成了数据的发送工作,但是仍然等待从远程端点接受数据,在这种情况下,我们需要对套接口进行半关闭操作,就需要用到shutdown函数:

#include <sys/socket.h>

int shutdown(int s, int how);

其中s是需要进行半关闭的套接口,需要进行关闭的方式是how,参数how的取值请看下表:

描述
0 SHUT_RD 进程不能对指定套接口进行读操作
1 SHUT_WR 进行不能对指定套接口进行写操作
2 SHUT_RDWR 进程不能对指定套接口进行读写操作

大家可以看出,当how参数的取值为2的时候,shutdown函数和close函数一样了。下面举一个例子:

int state;
int s;

state=shutdown(s,SHUT_WR);
if(z == -1){
	perror("shundown...");
}

下面我们来看看如何处理复制套接口的情况:

   如果调用函数dup或者dup2的话,那么只有最后一个close调用才可以关闭套接口,系统这样做,是因为他认为其他复制的文件描述符仍然在使用中,如下所示:

   int s;   //已经存在的套接口

  int d;    //被复制的套接口

  d=dup(s); //复制套接口

  close(s) // 套接口并未被关闭

  close(d) //套接口被关闭

在上面的例子中,第一个close函数调用并没有关闭套接口,其实无论先关闭s还是先关闭d,没任何区别。而只有当最后一个文件描述符被关闭的时候,套接口才是被真正的关闭了。但是如果使用shutdown函数的话,就没有这个问题。:

int s

int d;

d=dup(s);

shutdown(s,SHUT_RDWR);

即使套接口s仍然通过文件描述符d打开,shutdown函数仍然立即将套接口彻底关闭。

建议:总是使用shutdown函数来代替close函数。

当调用shutdown函数的时候,如果给定的套接口不是有效的文件描述符,返回EBADF错误。

如果给定的文件描述符不是套接口,返回ENOTSOCK错误

如果套接口出于非连接状态,返回ENOTCONN错误。

注意:即便是使用参数为SHUT_RDWR的时候,函数shutdown也不会释放文件描述符,在使用close释放文件描述符之前,他一直可用。


==============================================================================

本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/08/16/2641838.html,如需转载请自行联系原作者

相关文章
|
2月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
271 17
|
2月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
84 18
|
2月前
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
100 10
|
4月前
|
消息中间件 监控 算法
用Apifox调试Socket.IO接口,从原理到实践
传统HTTP协议"请求-响应"的离散式通信机制已难以满足需求,这正是Socket.IO这类实时通信框架的价值所在。
用Apifox调试Socket.IO接口,从原理到实践
|
4月前
|
JSON 测试技术 网络安全
如何调试 Socket.IO 接口?图文教程
Socket.IO 是一个用于实现低延迟、双向和基于事件通信的库,广泛应用于实时应用开发中。有效测试 Socket.IO 接口对于确保应用稳定性和功能正确性至关重要。本文介绍如何使用 Apifox 轻松进行 Socket.IO 接口测试,包括新建接口、监听事件、发送消息、配置握手参数、使用变量、保存和共享接口等步骤。Apifox 操作简便、功能完善,是开发者调试 Socket.IO 接口的得力助手,帮助确保实时通信的可靠性和稳定性,提高开发效率。
|
4月前
|
监控 API 开发工具
Socket.IO介绍,以及怎么连接测试Socket.IO接口?
Socket.IO 是一个用于浏览器和服务器间实时双向通信的库,支持低延迟消息传递、跨平台运行及自动重连。文章介绍了其特点与调试需求,并详细说明如何使用 Apifox 工具创建、连接、发送/接收 Socket.IO 事件,以及团队协作和调试技巧。掌握这些技能可提升实时应用开发效率与质量。
|
9月前
|
Unix 关系型数据库 MySQL
Linux 简介
Linux 简介
123 2
Linux 简介
|
10月前
|
Linux Docker 容器
Linux的namespace和cgroups简介
本文介绍了Linux的Namespace技术和cgroups,解释了它们如何帮助实现容器的隔离和资源限制。
225 7
Linux的namespace和cgroups简介
|
9月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
343 1
|
9月前
|
大数据 Linux 开发工具
【Linux】命令简介------迅速掌握Linux命令
【Linux】命令简介------迅速掌握Linux命令