Liunx - 网络编程
Liunx - 网络编程
一 基础知识
1. TCP / UDP
- TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
- 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节。
- TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
2. 端口
一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等
这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。
实际上是通过“IP地址+端口号”来区 分不同的服务的。端口提供了一种访问通道,服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69
3. 字节序
- Little endian(小端字节序):将低序字节存储在起始地址
- Big endian(大端字节序):将高序字节存储在起始地址
二 代码实现
1. 编程思路
1.1 服务器
- 表名身份(服务器)
- 连接方式(TCP / UDP)
- IP 地址
- 端口
- 等待访问
1.2 客户端
- 获取服务器 IP
- 获取服务器端口连接
2. 相关 API
3. socket 服务器端 / 客户端 开发步骤
- 创建套接字
- 套接字添加信息 (IP 地址 和 端口 )
- 监听网络连接
- 监听到有客户端接入,接受连接
- 数据交互
- 关闭套接字,关闭连接
4. 代码实现
服务端
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
// 服务端
int main(int argc,char **argv){int s_fd ; int c_fd ;int n_read ;char sendBuf[128] = "welcome!!!"; char readBuf[128] = {0}; struct sockaddr_in s_addr ; struct sockaddr_in c_addr ; memset(&s_addr , 0 , sizeof(struct sockaddr_in)); memset(&c_addr , 0 , sizeof(struct sockaddr_in));if(argc != 3 ){perror("argc");}// 1. sockets_fd = socket(AF_INET,SOCK_STREAM,0); if(s_fd == -1 ){perror("socket");exit(-1);} // 2. bind s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1],&s_addr.sin_addr);bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));// 3. listen listen(s_fd,10); while(1){// 4. accept int clen = sizeof(struct sockaddr_in);c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);if(c_fd == -1 ){perror("accept\n");exit(-1);} if(fork() == 0 ){while(1){// 6. write // char* msg = "welcome !!! \n" ; printf("client ip is %s ",inet_ntoa(c_addr.sin_addr)); printf(">");gets(sendBuf);write(c_fd , sendBuf,strlen(sendBuf));printf("\n");}} if(fork() == 0){while(1){ // 5. read memset(readBuf,0,sizeof(readBuf));n_read = read(c_fd,readBuf,128); if(n_read == -1 ){perror("read");exit(-1);}else{printf("mess is %s\n",readBuf);}} } }return 1 ;
}
客户端
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main(int argc , char **argv){int c_fd; int n_read;char readBuf[128];//char* msg = "hello this is laopi server \n" ;char sendBuf[128] = {0};struct sockaddr_in c_addr ; memset(&c_addr , 0 , sizeof(struct sockaddr_in));if(argc != 3){perror("argc");}// 1. socketc_fd = socket(AF_INET,SOCK_STREAM,0); if(c_fd == -1 ){perror("socket\n");exit(-1);}c_addr.sin_family = AF_INET ; c_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1],&c_addr.sin_addr);// 2. connect if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1) {perror("connect\n");exit(-1);}if(fork() == 0 ){while(1){// 5. read memset(readBuf,0,128);n_read = read(c_fd,readBuf,128); if(n_read == -1 ){perror("read");exit(-1);}else{printf("server %s port %s : %s \n",argv[1],argv[2],readBuf);}}}while(1){memset(sendBuf,0,sizeof(sendBuf));printf(">");gets(sendBuf);// 3.send write(c_fd ,sendBuf,strlen(sendBuf));printf("\n");}return 1 ;
}
Liunx - 网络编程相关推荐
- Liunx之网络编程
Liunx网络编程 进程 线程 TCP/IP协议簇 并发编程 操作系统 进程 进程:资源分配的最小单元,操作系统执行的最小单位: Linux对进程采用了一种层次系统,每个进程都依赖于一个父进程.内核启 ...
- Liunx系统编程(五)网络编程
协议栈: Linux的优点之一就是在于它丰富而稳定的网络协议栈,其范围是从协议无关层(如通用的socket层接口和设备层)到各种网络协议的实现. 对于网络理论介绍一般采用OSI模型,但是Linux中网 ...
- 你对Java网络编程了解的如何?Java NIO 网络编程 | Netty前期知识(二)
本文主要讲解NIO的简介.NIO和传统阻塞I/O有什么区别.NIO模型和传统I/O模型之间的对比.以及围绕NIO的三大组件来讲解,理论代码相结合. 很喜欢一句话:"沉下去,再浮上来" ...
- Python 爬虫 (三) - Socket 网络编程
原文出处: Andrew_liu python的网络变成比c语言简单许多, 封装许多底层的实现细节, 方便程序员使用的同时, 也使程序员比较难了解一些底层的东西, 我觉得学网络编程还是用c语言更好一点 ...
- Python 异步网络编程实战
Python 异步网络编程实战 - songcser - 掘金小册 小册介绍 第一部分是对 Python 协程的讲解,从字节码开始简单讲解了 Python 虚拟机的执行过程,可以大体了解到 Pytho ...
- python网络编程实战_Python 异步网络编程实战
近年来 Python 的发展的非常迅速,"简单"."高效"是 Python 吸引人的一大特色.在国内 Python 开发需求越来越大,Python 具有丰富强大 ...
- Linux网络编程--进程间通信(一)
进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...
- C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。
C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口. 最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件 抖动窗口功能 ...
- java基于http协议编程_Java中基于HTTP协议网络编程
java中为我们的网络支持提供了java.net包,能够使我们以编程的方式来访问Web服务功能,这篇博客,就跟大家分享一下,Java中的网络编程的知识,主要是学习下该java.net包下的API. U ...
最新文章
- 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
- MySQL 过滤规则-误解处理
- pix2pix, pix2pixHD, vid2vid
- Python学习笔记《Python核心编程》第4章Python对象
- centos yum安装时出现 cannot find a valid baseurl for repo: addons
- wampserver无法打开http://127.0.0.1/
- IOS基础之datePicker的使用
- 用数据库修改服务器的时间格式,如何查询数据库服务器的时间格式
- linux java 进程内存_linux – 在java进程中消耗内存的是什么?
- 【Python3网络爬虫开发实战】1.2.4-GeckoDriver的安装
- 安全测试===Mysql 注入练习网站(3)
- Vue只是JavaScript其中的一个框架
- 2022年第十九届五一数学建模竞赛 C题 火灾报警系统问题
- Canvas API
- 读万卷书,行万里路,写万行Code
- 一种用于指导模拟 IC 布局的定制图神经网络模型
- 《Python编程:从入门到实践》 第5章习题
- 表格号码归属地查询的正确检测方式
- 基于JIRA的产品需求全生命周期管理实践
- 在Visual Studio 2010/2012/2013/2015上使用C#开发Android/IOS安装包和操作步骤
热门文章
- excel 数据标签格式/数据标签位置没有数据标签外选项
- 测试贵在坚持,看一名普通测试人员的经历
- 计算机er应该选择保研还是出国?
- 计算思维就是指计算机程序 即计算机的思维,[数学思维在计算机程序设计中的体现]计算机思维的本质是指...
- VS2019连接SQL Server数据库
- 南京邮电大学计算机考研经验
- yolo3训练时的问题
- 动态规划:砍死怪兽的概率
- DCache-CacheServer分析(五)
- matlab输入指令错误怎么修改,在MATLAB中运行程序时,显示错误: 此上下文中不允许函数定义。 怎么修改?...