通过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 高性能服务端组件的设计与实现
设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能.伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性.可用 ...
随机推荐
- 戴尔R7920工作站利用PVE开启vGPU,实现工作站虚拟化(ShareStation)
介绍 本文介绍了使用Proxmox VE(PVE) + DoraCloud,将一台Dell R7920图形工作站(配置有NVIDIA RTX A6000显卡)实现工作站虚拟化.可以满足多个设计用户同时 ...
- korean doll likeness模型|Japanese-doll-likeness模型获取及使用
1.模型 之前给大家写了Mac安装stable-diffusion-webui绘制AI妹子保姆级教程,教程在下面 [奶奶看了也不会]AI绘画 Mac安装stable-diffusion-webui绘制 ...
- java的char类型,只有两个字节,为什么可以存储汉字?java中 char详解
我自己出了一道面试题,如下: public static void main(String[] args) { char a = '9'; char b = 9; char c = '我'; Syst ...
- 安装DNS服务
实验介绍: DNS的作用 DNS中文名为域名系统 它能实现域名与IP地址的互相转换 域名的命名 www.cnblogs.com 其中.com是网站是顶级域名,.cnblogs是博客园是二级域名,www ...
- MySQL-正则表达式规范
MySQL中的正则表达式采用的是PCRE的规范,匹配时按字符进行. RLIKE 您可以使用RLIKE语句匹配正则表达式,支持的元字符如下表所示. 元字符 说明 ^ 行首. $ 行尾. . 任意字符. ...
- 【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据
1 简介 本文以 mp4 文件为例,讲解去音频操作.mp4 是一种视频封装的容器,里面包含音频(audio)和视频(video)数据,对应的数据编码格式分别为 aac 和 h264.在去音频过程中 ...
- Java设计模式-建造者模式Builder
介绍 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式.它可以 将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方 法可以构造出不同表现(属性)的对象 ...
- win32- GetMessage的使用
BOOL bRet; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle th ...
- java学生管理系统(界面版)
运行截图 项目说明: 本系统界面我个人就从简设计了,本来打算使用windowbuilder插件设计的,可想到使用windowbuilder插件之后导致代码冗余,会影响到代码可读性,可能对小白不友好.虽 ...
- instance must be started before calling this method
解决方法 检查zk的连接数: 端口号: 数据库连接配置: zk的连接配置: 如果都没有问题,就重启容器.