网络编程(基于socket接口技术的进程间通信)接上一篇文章补充
目录
一、网络编程(基于socket接口技术)
1、基于TCP协议的网络通信
编程模型:
2、基于UDP通信协议的网络通信
编程模型:
3、新增函数:
大小端数据转换函数:
ip地址转换函数:
TCP数据发送函数:
TCP数据接收函数:
UDP的数据发送函数:
UDP的数据接收函数:
代码示例:
服务端:
客户端:
一、网络编程(基于socket接口技术)
底层遵循TCP|IP协议,在系统层上以Socket接口方式呈现
1、基于TCP协议的网络通信
编程模型:
服务器 | 客户端 |
创建socket对象 | 创建socket对象 |
准备地址通信(端口号、本机IP地址) | 准备(对方)通信地址(服务器公 网IP) |
绑定socket与通信地址 | 。。。 |
设置监听和排队数量 | 。。。 |
等待客户端连接 | 连接 |
分配新的socket对象+开辟新进程或线程服务对象 | .... |
接收/响应请求 | 响应/接收请求 |
关闭socket | 关闭socket |
2、基于UDP通信协议的网络通信
编程模型:
接收端 | 发送端 |
创建socket | 创建socket |
准备通信地址 | 准备通信地址 |
绑定 | 。。。 |
接收/发送请求 | 发送/接收请求 |
关闭socket | 关闭socket |
3、新增函数:
大小端数据转换函数:
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
- 功能:把4字节的本地字节序转换成网络字节序
uint16_t htons(uint16_t hostshort);
- 功能:把2字节的本地字节序转换成网络字节序
uint32_t ntohl(uint32_t netlong);
- 功能:把4字节的网络字节序转换成本地字节序
uint16_t ntohs(uint16_t netshort);
- 功能:把2字节的网络字节序转换成本地字节序
ip地址转换函数:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
- 功能:把字符串格式的点分十进制表示的ip地址转换成整数形式的ip地址(大端)
char *inet_ntoa(struct in_addr in);
- 功能:把整数形式的ip地址转换成字符串格式的点分十进制表示的ip地址
#include <sys/types.h>
#include <sys/socket.h>
TCP数据发送函数:
ssize_t send(int sockfd,const void *buf, size_t len, int flags);
功能:TCP协议通信时专用的数据发送函数
sockfd:连接成功的socket描述符
buf:待发送数据的首地址
len:要发送的字节数
flags:
0 阻塞发送
1 不阻塞发送
返回值:成功发送的字节数
-1 出现错误
0 连接断开
TCP数据接收函数:
ssize_t recv(int sockfd,void *buf,size_t len, int flags);
功能:TCP协议通信时专用的接收数据函数
sockfd:连接成功的socket描述符
buf:存储数据缓冲区内存首地址
len:缓冲区的大小
flags:
0 阻塞接收
1 不阻塞接收
返回值:成功接收的字节数
-1 出现错误
0 连接断开
UDP的数据发送函数:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
功能:UDP协议发送数据
sockfd:socket描述符
buf:待发送数据内存首地址
len:待发送数据的字节数
flags:是否阻塞 一般写0阻塞即可
dest_addr:通信目标的地址
addrlen:地址结构体的字节数
返回值:成功发送的字节数
0 通信关闭
-1 出现错误
UDP的数据接收函数:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:UDP协议接收数据
sockfd:socket描述符
buf:存储接收数据的缓冲区内存首地址
len:缓冲区的字节数
flags:是否阻塞 一般写0阻塞即可
src_addr:用于存储发送者的地址
addrlen:既是输入,也是输出
1、既告诉函数当前src_addr结构体的字节数
2、同时也能实际接收到发送者的地址结构体字节数
返回值:成功接收到的字节数
0 通信关闭
-1 出现错误
代码示例:
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>typedef struct sockaddr *SP;//子进程接受/处理信息
void server_cli(int cli_fd)
{char buf[4096] = {};size_t buf_size = sizeof(buf);for(;;){//接收请求int ret = recv(cli_fd,buf,buf_size,0);if(0 == strcmp(buf,"quit") || 0 >= ret){printf("客户端%d退出!\n",cli_fd);break;}printf("from%d recv:%s bits:%d\n",cli_fd,buf,ret);//响应请求strcat(buf,"from:server");ret = send(cli_fd,buf,strlen(buf)+1,0);if(0 >= ret){printf("客户端%d退出!\n",cli_fd);break;}}close(cli_fd);exit(0);
}int main(int argc,const char* argv[])
{//创建socketint sockfd = socket(AF_INET,SOCK_STREAM,0);if(0 > sockfd){perror("socket");return EXIT_FAILURE;}//准备本机通信地址struct sockaddr_in addr = {};addr.sin_family = AF_INET;addr.sin_port = htons(5566);//本机IP addr.sin_addr.s_addr = inet_addr("IP地址(不展示)");socklen_t addrlen = sizeof(addr);//绑定if(bind(sockfd,(SP)&addr,addrlen)){perror("bind");return EXIT_FAILURE;}//监听if(listen(sockfd,5)){perror("listen");return EXIT_FAILURE;}for(;;){//等待连接struct sockaddr_in cli_addr = {};int cli_fd = accept(sockfd,(SP)&cli_addr,&addrlen);if(0 > cli_fd){perror("accept");continue;}//创建进程服务客户端if(0 == fork()){server_cli(cli_fd);}}}
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>typedef struct sockaddr* SP;int main(int argc,const char* argv[])
{//创建socket文件int sockfd = socket(AF_INET,SOCK_STREAM,0);if(0 > sockfd){perror("socket");return EXIT_FAILURE;}//准备服务器公网通信地址struct sockaddr_in addr = {};addr.sin_family = AF_INET;addr.sin_port = htons(5577);addr.sin_addr.s_addr = inet_addr("服务器IP地址");socklen_t addrlen = sizeof(addr);//连接服务器if(connect(sockfd,(SP)&addr,addrlen)){perror("connect");return EXIT_FAILURE;}char buf[4096] = {};size_t buf_size = sizeof(buf);for(;;){printf(">>>");fgets(buf,buf_size,stdin);//发送请求int ret = send(sockfd,buf,strlen(buf)+1,0);if(0 >= ret){perror("updata!\n");break;}if(0 == strncmp(buf,"quit",4)){printf("leave\n");break;}//接收响应ret = recv(sockfd,buf,buf_size,0);if(0 >= ret){printf("leave!\n");break;}printf("recv:%s bits:%d]n",buf,ret);}close(sockfd);}
网络编程(基于socket接口技术的进程间通信)接上一篇文章补充相关推荐
- socket网络编程——基于socket通信实现对客户端与服务器间的文件互传
客户端与服务器间的文件互传 基于socket的文件数据互传,将文件中所有的字符一一通过buf进行传递,为了更好地判断文件的 结束,通过添加文件结束标识符"#",当接收端接收到该字符 ...
- C++笔记--Linux网络编程(15-0)-socket(供自查,文档说明)
目录 网络基础 协议的概念 什么是协议 典型协议 网络应用程序设计模式 C/S模式 B/S模式 优缺点 分层模型 OSI七层模型 TCP/IP四层模型 通信过程 协议格式 数据包封装 以太网帧格式 A ...
- Python网络编程(OSI Socket)
文章目录 一.软件开发架构 二.网络编程简介 三.OSI七层协议 五.网络相关名词 八.Socket套接字 九.半连接池 十.黏包问题 一.软件开发架构 什么是软件开发架构?编写项目前需要遵循代码层面 ...
- 网络编程及socket模块
目录 1.必备基础 1.1 网络架构 1.1.1 交换机 1.1.2 路由器 1.1.3 三层交换机 1.1.4 小型企业基础网络架构 1.1.5 家庭网络架构 1.1.6 互联网 1.2 网络核心词 ...
- Python 网络编程(Socket)
Python 网络编程(Socket) 一.Socket 套接字 1.Socket 编程 socket本质是编程接口(API),对TCP/IP的封装,提供可供程序员做网络开发所用的接口.Socket ...
- Java网络编程:socket与Netty
Java网络编程:socket与Netty Java网络编程:socket与Netty TCP/IP介绍 简介 数据传输 TCP粘包和黏包 现象 为什么出现 如何解决 Socket介绍 介绍 功能开发 ...
- 网络编程——基于TCP协议的通讯录【课程设计】
网络编程--基于TCP协议的通讯录[课程设计] 本文目录 网络编程--基于TCP协议的通讯录[课程设计] 一.设计题目和要求 设计目标: 课程设计系统组成及模块功能: 二.设计内容 服务端 客户端 S ...
- 单片机微型计算机原理及接口技术陈,单片机微型计算机原理及接口技术课后习题答案第4章(5页)-原创力文档...
单片机微型计算机原理及接口技术课后习题答案第4章 4-1 分别指出下列指令中的源操作数和目的操作数的寻址方式 源操作数寻址方式 目的操作数寻址方式 (1)MOV P1,20H 直接寻址 直接寻址 (2 ...
- linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...
陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...
最新文章
- 年末回顾:2021年 AI 领域十大研究趋势及必读论文
- 最大调用堆栈大小超出错误
- 移动端h5开发总结不断更新中....
- 解决Genymotion运行Android 5.0一直卡在开机界面
- 【测试】用示波器抓取红外遥控器NEC信号
- 报错: MLPClassifier:ConvergenceWarning: Stochastic Optimizer: Maximum iterations (400) reached
- 也来谈谈这致命的手机充电器
- 如何使用MySQL和JPA使用Spring Boot构建Rest API
- 图像处理相关知识(不断更新)
- 学会python的基础操作题_Python基本操作题
- 代理模式 委派模式 策略模式_设计模式 - 委派模式
- 【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)
- 【JavaWeb】【笔记】《JavaWeb入门经典》 第15章 Struts框架
- 如何在计算机设置鼠标宏,鼠标宏设置教程
- 大龄程序员的出路究竟在何处?从369个过来人问答贴里,我们得到了答案
- 从大数据+AI 谈谈概念与场景
- 当鼠标移动到表单上,改变表单的颜色
- PCI相关(2)- PCI桥与配置
- 英二变英一,数二变数一!考研人太难了……
- threejs知识点:1.模型分析
热门文章
- Python 数据采集-爬取学校官网新闻标题与链接(基础)
- 物体移动时,面朝移动方向旋转
- 下载windows10.iso
- 大数据的5大关键技术点
- 我的魅族开不了机了,一直卡在开机界面
- idea 导入别人的项目后,显示包的名称错误does not correspond to the file path
- 【多任务优化】DWA、DTP、Gradnorm(CVPR 2019、ECCV 2018、 ICML 2018)
- 【论文笔记】Multi-Interactive Attention Network for Fine-grained Feature Learning in CTR Prediction
- CISP 相关知识点梳理
- 创建单链表的头插法与尾插法详解