通过socket进行网络通信(服务端)
声明:此文只是为自己方便理解,做了一些具象的比喻和假设,并不符合客观事实,谨慎阅读!
在一台主机中, 两个进程想要通信可以通过一个管道(文件):一个从管道的一端写,一个从另一端读 , 然而管道是半双工的 , 如果一个进程既想读又想写 , 那就创建两个管道。利用socket进行网络通信的过程与之类似:将对方主机抽象成一个全双工管道文件,为其创建文件描述符,对这个文件描述符进行读写。
创建监听套接字
int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
创建监听套接字的目的是监听是否有客户端连接该主机,但只有一个文件描述符客户端是找不到的,客户端是通过IP地址和端口找到需要通信的进程的,所以要将该listen_fd与IP地址和端口绑定,方便起见,将IP与端口定义成一个结构体。
监听套接字与端口绑定
// 先初始化IP + 端口 这个结构体
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
// 设置端口
server_addr.sin_port = htons(8080);
// 设置ip
inet_pton(AF_INET, "192.xx.xxx.xx", &server_addr.sin_addr.s_addr);
// 将监听套接字与 ip+端口绑定
bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(addr));
现在网络上已经有一个“管道”通向服务器,其他主机想要通信并不是直接写这个“管道”,而是通过该“管道”再申请一个专门通信的“管道”。原因很简单,一个服务大众的人民公园不可能只设一个大门。于是,主机通过listen_fd监听到有人来通信,就新创建一个“管道”来通信。就好像住酒店,要先在前台(listen_fd)订房间(client_fd),然后房间(client_fd)里睡觉,而不能在前台(listen_fd)睡觉。

监听并接受一个新客户
listen(listen_fd);
// 此时有用户连接
//client_addr接受客户的地址信息:IP + 端口
struct sockaddr_in client_addr;
int client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);
读写,关闭
此时就可以对client_fd进行读写;
char buf[1024];
read(client_fd,buf,sizeof(buf));
write(client_fd, buf, sizeof(buf));
close(client_fd);
通过socket进行网络通信(服务端)的更多相关文章
- Socket通信时服务端无响应,客户端超时设置
背景:在写一个客户端的socket程序,服务端没有返回消息,客户端一直在等待. 目标:我需要设置一个时间,如果超过这个时间客户端自动断开连接.最好是在服务端实现,客户端对我来说不可控.
- 用c++语言socket库函数实现服务端客户端聊天室
客户端 /* * 程序名:client.cpp,此程序用于演示socket的客户端 * 作者:C语言技术网(www.freecplus.net) 日期:20190525 */ #include < ...
- Socket聊天程序——服务端
写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- c#Socket客户端和服务端的信息发送
这是我制作的界面信息,c# Socket通信的简单使用,刚开始学习,不对的地方请大家指教,目前是可以运行的,之后自己在慢慢添加新的东西.同时了解Tcp协议的三次握手.希望对跟我一样的初学者有所帮助. ...
- socket创建UDP服务端和客户端
UDP服务端代码示例: from socket import * #1.创建数据报套接字 sockfd = socket(AF_INET, SOCK_DGRAM) #2.绑定服务端地 sockfd.b ...
- socket创建TCP服务端和客户端
看情况选择相对应的套接字*面向连接的传输--tcp协议--可靠的--流式套接字(SOCK_STREAM)*面向无连接的传输--udp协议--不可靠的--数据报套接字(SOCK_DGRAM) 在liun ...
- socket 客户端和服务端通信
客户端要连接服务器:首先要知道服务器的IP地址.而服务器里有很多的应用程序,每一个应用程序对应一个端口号 所以客户端想要与服务器中的某个应用程序进行通信就必须要知道那个应用程序的所在服务器的IP地址, ...
- 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能.伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性.可用 ...
随机推荐
- docker之redis集群部署
docker之redis集群部署 PART01: 3主3从redis集群部署 3主3从redis集群配置 关闭防火墙,启动docker服务 如果报以下错误,应该是docker 服务没有启动,可以执行下 ...
- Java并发(十)----线程之守护线程
默认情况下,Java 进程需要等待所有线程都运行结束,才会结束.有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束. 例: log.debug(&q ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第8章)
第 8 章 服务发现 面对大量服务,为了简化配置和管理工作,我们需要了解"服务发现"概念 回顾云原生特性 配置外置 将 URL 和登录凭证移到配置文件和 C# 代码之外,放到环境变 ...
- Linux-查看文本中第m行到n行的内容
如何查看文件第6749行到6758行? 方式一:使用sed命令 不显示行号:sed -n 'M,Np' fileName 例如:sed -n '6749,6758p' hive-default.x ...
- NC51179 选课
题目链接 题目 题目描述 学校实行学分制. 每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分. 学校开设了 N 门的选修课程,每个学生可选课程的数量 M 是给定的. 学生选修了这 M 门课 ...
- CF510D Fox And Jumping
题目链接 题目 见链接. 题解 方法一 知识点:背包dp,STL. 题目意思是让我们判断能否从这些数中选出一些数使得选的数公共gcd为 \(1\),如果可以输出最小花费. 一眼背包dp,但要map超大 ...
- 走进Kaggle的未知领域:性别和年龄推断算法解析
1.环境设置: 此环节将加载实现笔记本无缝功能的基本模块,包括NumPy.Pandas和TensorFlow等库.此外,它还建立了关键的环境常数,如图像尺寸和学习率,这对后续分析和模型训练至关重要 ...
- 搭建Windows环境下的多功能免费SSH客户端
关于Windows下的SSH客户端工具,可以有许多选择,从开源免费到商业收费的,零零总总. 免费版: Putty就是最简单的SSH客户端,非常轻量级. Electerm是一个开源可免费使用的跨平台SS ...
- queryset高级用法:prefetch_related
这个方法和select_related方法类型,就是访问多个表中的数据的时候,减少查询的次数.这个方法是为了解决一对多和多对多的关系的查询问题.比如要获取标题中带有hello字符串的文章以及它的所有标 ...
- 【Azure 事件中心】Event Hub Client 连接超时(OperationTimeout)测试及解说
Azure Event Hub(Azure事件中心) 是大数据流式处理平台和事件引入服务. 它可以每秒接收和处理数百万个事件.在我们的使用中,需要代码编写的是两个部分:事件生产者和事件接收者 事件生成 ...