温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何分析Linux系统中的socket编程

发布时间:2022-01-25 11:51:17 来源:亿速云 阅读:159 作者:柒染 栏目:开发技术

这篇文章跟大家分析一下“如何分析Linux系统中的socket编程”。内容详细易懂,对“如何分析Linux系统中的socket编程”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“如何分析Linux系统中的socket编程”的知识吧。

socket简介:

socket 是计算机网络中用于在节点内发送或接收数据的内部端点。具体来说,它是网络软件 (协议栈) 中这个端点的一种表示,包含通信协议、目标地址、状态等,是系统资源的一种形式。

它在网络中所处的位置大致就是下面的黑色部分,应用层与传输层之间。

如何分析Linux系统中的socket编程如何分析Linux系统中的socket编程

其中的传输层就是 TCP/IP 所在的地方,而你平时通过代码编写的应用程序大多属于应用层范畴,socket 在这里起到就是连接应用层与传输层的作用。

socket 的诞生是为了应用程序能够更方便的将数据经由传输层来传输,所以它本质上就是对 TCP/IP 的运用进行了一层封装,然后应用程序直接调用 socket API 即可进行通信。那么它是如何工作的呢?它分为 2 个部分,服务端需要建立 socket 来监听指定的地址,然后等待客户端来连接。而客户端则需要建立 socket 并与服务端的 socket 地址进行连接。

server端的简单示例:

经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上去。

绑定socket到一个端口上去

bind()函数可以将socket绑定一个端口上,client可以通过这个端口发起请求,端口对应的socket便会与client端的socket连接。

 #include #include #include #include #Include
 
 int main()
 {
 int socket_desc;
 struct sockaddr_in server;
 
 socket_desc = socket(AF_INET,SOCK_STREAM,0);
 if(-1==socket_desc)
 {
 perror("socket create error\n");
 exit(1);
 }
 
 //监听服务器自身
 
 server.sin_family=AF_INET;
 server.sin_port = htons(8888);
 server.sin_addr.s_addr = INADDR_ANY;
 
 //绑定到端口
 
 if(bind(socket_desc,(struct sockaddr* )&server,sizeof(server))对于socket绑定到一个明确的端口上,我们接下来要做的就是接受这个端口下面的所有数据。。通过上面的实现,我们可以看出一个端口只能被一个socket使用。监听端口:在绑定完成socket与端口之后,我们还需要去监听端口。为此,我们需要将socket设置在被监听的状态。listen()将被用来将socket设置为被监听的模式下。listen( socket_desc, 3);listen(int sockfd,int backlog);可以将socket处于监听的状态下接收请求建立连接: #include #include #include #include
 
 int main()
 {
 int sock_desc,new_socket,sockaddr_size;
 struct sockaddr_in server,client;
 
 //创建socket
 sock_desc = socket(AF_INET,SOCK_STREAM,0);
 if(-1==sock_desc)
 {
 perror("cannot create socket\n");
 exit(1);
 }
 
 server.sin_family = AF_INET;
 server.sin_port = htons(8888);
 server.sin_addr.s_addr = INADDR_ANY;
 
 //绑定
 
 if(bind(sock_desc,(struct sockaddr*)&server,sizeof(server))运行上述代码:输出:waiting for incoming connecions.现在代码已经正常跑起来了,并且等待请求连接。在另外一个终端内,我们发起一个请求:teltnet 127.0.0.1 8888在当前这个终端内将会输出:trying 127.0.0.1connected to loaclhost。Escape character is ;;connection closed by foreign host同时在之前的终端中,server会输出:waiting for incoming connecions.connection accepted便可以看到,server已经正确接收了client的连接请求并建立了连接,只是没有了后续操作,主机紧接着关闭了这个链接。连接建立之后便可以顺利地进行双方的通信,这部分的send与recv操作完全一样。另外, 服务端获取客户端的ip地址:由前面能够知道accept()返回的是结构体sockaddr_in ,由此很容易得知client的ip和端口信息。** ** char * client_ip = inet_ntoa(client.sin_addr);``int` `client_port = ntohs(client.sin_port);以上就是良许教程网为各位朋友分享的Linux系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你!

关于如何分析Linux系统中的socket编程就分享到这里啦,希望上述内容能够让大家有所提升。如果想要学习更多知识,请大家多多留意小编的更新。谢谢大家关注一下亿速云网站!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI