目录

一、网络编程(基于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接口技术的进程间通信)接上一篇文章补充相关推荐

  1. socket网络编程——基于socket通信实现对客户端与服务器间的文件互传

    客户端与服务器间的文件互传 基于socket的文件数据互传,将文件中所有的字符一一通过buf进行传递,为了更好地判断文件的 结束,通过添加文件结束标识符"#",当接收端接收到该字符 ...

  2. C++笔记--Linux网络编程(15-0)-socket(供自查,文档说明)

    目录 网络基础 协议的概念 什么是协议 典型协议 网络应用程序设计模式 C/S模式 B/S模式 优缺点 分层模型 OSI七层模型 TCP/IP四层模型 通信过程 协议格式 数据包封装 以太网帧格式 A ...

  3. Python网络编程(OSI Socket)

    文章目录 一.软件开发架构 二.网络编程简介 三.OSI七层协议 五.网络相关名词 八.Socket套接字 九.半连接池 十.黏包问题 一.软件开发架构 什么是软件开发架构?编写项目前需要遵循代码层面 ...

  4. 网络编程及socket模块

    目录 1.必备基础 1.1 网络架构 1.1.1 交换机 1.1.2 路由器 1.1.3 三层交换机 1.1.4 小型企业基础网络架构 1.1.5 家庭网络架构 1.1.6 互联网 1.2 网络核心词 ...

  5. Python 网络编程(Socket)

    Python 网络编程(Socket) 一.Socket 套接字 1.Socket 编程 socket本质是编程接口(API),对TCP/IP的封装,提供可供程序员做网络开发所用的接口.Socket ...

  6. Java网络编程:socket与Netty

    Java网络编程:socket与Netty Java网络编程:socket与Netty TCP/IP介绍 简介 数据传输 TCP粘包和黏包 现象 为什么出现 如何解决 Socket介绍 介绍 功能开发 ...

  7. 网络编程——基于TCP协议的通讯录【课程设计】

    网络编程--基于TCP协议的通讯录[课程设计] 本文目录 网络编程--基于TCP协议的通讯录[课程设计] 一.设计题目和要求 设计目标: 课程设计系统组成及模块功能: 二.设计内容 服务端 客户端 S ...

  8. 单片机微型计算机原理及接口技术陈,单片机微型计算机原理及接口技术课后习题答案第4章(5页)-原创力文档...

    单片机微型计算机原理及接口技术课后习题答案第4章 4-1 分别指出下列指令中的源操作数和目的操作数的寻址方式 源操作数寻址方式 目的操作数寻址方式 (1)MOV P1,20H 直接寻址 直接寻址 (2 ...

  9. linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...

    陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...

最新文章

  1. 年末回顾:2021年 AI 领域十大研究趋势及必读论文
  2. 最大调用堆栈大小超出错误
  3. 移动端h5开发总结不断更新中....
  4. 解决Genymotion运行Android 5.0一直卡在开机界面
  5. 【测试】用示波器抓取红外遥控器NEC信号
  6. 报错: MLPClassifier:ConvergenceWarning: Stochastic Optimizer: Maximum iterations (400) reached
  7. 也来谈谈这致命的手机充电器
  8. 如何使用MySQL和JPA使用Spring Boot构建Rest API
  9. 图像处理相关知识(不断更新)
  10. 学会python的基础操作题_Python基本操作题
  11. 代理模式 委派模式 策略模式_设计模式 - 委派模式
  12. 【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)
  13. 【JavaWeb】【笔记】《JavaWeb入门经典》 第15章 Struts框架
  14. 如何在计算机设置鼠标宏,鼠标宏设置教程
  15. 大龄程序员的出路究竟在何处?从369个过来人问答贴里,我们得到了答案
  16. 从大数据+AI 谈谈概念与场景
  17. 当鼠标移动到表单上,改变表单的颜色
  18. PCI相关(2)- PCI桥与配置
  19. 英二变英一,数二变数一!考研人太难了……
  20. threejs知识点:1.模型分析

热门文章

  1. Python 数据采集-爬取学校官网新闻标题与链接(基础)
  2. 物体移动时,面朝移动方向旋转
  3. 下载windows10.iso
  4. 大数据的5大关键技术点
  5. 我的魅族开不了机了,一直卡在开机界面
  6. idea 导入别人的项目后,显示包的名称错误does not correspond to the file path
  7. 【多任务优化】DWA、DTP、Gradnorm(CVPR 2019、ECCV 2018、 ICML 2018)
  8. 【论文笔记】Multi-Interactive Attention Network for Fine-grained Feature Learning in CTR Prediction
  9. CISP 相关知识点梳理
  10. 创建单链表的头插法与尾插法详解