Liunx - 网络编程

一 基础知识

1. TCP / UDP

  1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  3. TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
  4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
  5. TCP首部开销20字节;UDP的首部开销小,只有8个字节。
  6. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

2. 端口

一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等
这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。
实际上是通过“IP地址+端口号”来区 分不同的服务的。端口提供了一种访问通道,服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69

3. 字节序

  1. Little endian(小端字节序):将低序字节存储在起始地址
  2. Big endian(大端字节序):将高序字节存储在起始地址

二 代码实现

1. 编程思路

1.1 服务器

  1. 表名身份(服务器)
  2. 连接方式(TCP / UDP)
  3. IP 地址
  4. 端口
  5. 等待访问

1.2 客户端

  1. 获取服务器 IP
  2. 获取服务器端口连接

2. 相关 API

3. socket 服务器端 / 客户端 开发步骤

  1. 创建套接字
  2. 套接字添加信息 (IP 地址 和 端口 )
  3. 监听网络连接
  4. 监听到有客户端接入,接受连接
  5. 数据交互
  6. 关闭套接字,关闭连接

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 - 网络编程相关推荐

  1. Liunx之网络编程

    Liunx网络编程 进程 线程 TCP/IP协议簇 并发编程 操作系统 进程 进程:资源分配的最小单元,操作系统执行的最小单位: Linux对进程采用了一种层次系统,每个进程都依赖于一个父进程.内核启 ...

  2. Liunx系统编程(五)网络编程

    协议栈: Linux的优点之一就是在于它丰富而稳定的网络协议栈,其范围是从协议无关层(如通用的socket层接口和设备层)到各种网络协议的实现. 对于网络理论介绍一般采用OSI模型,但是Linux中网 ...

  3. 你对Java网络编程了解的如何?Java NIO 网络编程 | Netty前期知识(二)

    本文主要讲解NIO的简介.NIO和传统阻塞I/O有什么区别.NIO模型和传统I/O模型之间的对比.以及围绕NIO的三大组件来讲解,理论代码相结合. 很喜欢一句话:"沉下去,再浮上来" ...

  4. Python 爬虫 (三) - Socket 网络编程

    原文出处: Andrew_liu python的网络变成比c语言简单许多, 封装许多底层的实现细节, 方便程序员使用的同时, 也使程序员比较难了解一些底层的东西, 我觉得学网络编程还是用c语言更好一点 ...

  5. Python 异步网络编程实战

    Python 异步网络编程实战 - songcser - 掘金小册 小册介绍 第一部分是对 Python 协程的讲解,从字节码开始简单讲解了 Python 虚拟机的执行过程,可以大体了解到 Pytho ...

  6. python网络编程实战_Python 异步网络编程实战

    近年来 Python 的发展的非常迅速,"简单"."高效"是 Python 吸引人的一大特色.在国内 Python 开发需求越来越大,Python 具有丰富强大 ...

  7. Linux网络编程--进程间通信(一)

    进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...

  8. C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。

    C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口. 最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件 抖动窗口功能 ...

  9. java基于http协议编程_Java中基于HTTP协议网络编程

    java中为我们的网络支持提供了java.net包,能够使我们以编程的方式来访问Web服务功能,这篇博客,就跟大家分享一下,Java中的网络编程的知识,主要是学习下该java.net包下的API. U ...

最新文章

  1. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
  2. MySQL 过滤规则-误解处理
  3. pix2pix, pix2pixHD, vid2vid
  4. Python学习笔记《Python核心编程》第4章Python对象
  5. centos yum安装时出现 cannot find a valid baseurl for repo: addons
  6. wampserver无法打开http://127.0.0.1/
  7. IOS基础之datePicker的使用
  8. 用数据库修改服务器的时间格式,如何查询数据库服务器的时间格式
  9. linux java 进程内存_linux – 在java进程中消耗内存的是什么?
  10. 【Python3网络爬虫开发实战】1.2.4-GeckoDriver的安装
  11. 安全测试===Mysql 注入练习网站(3)
  12. Vue只是JavaScript其中的一个框架
  13. 2022年第十九届五一数学建模竞赛 C题 火灾报警系统问题
  14. Canvas API
  15. 读万卷书,行万里路,写万行Code
  16. 一种用于指导模拟 IC 布局的定制图神经网络模型
  17. 《Python编程:从入门到实践》 第5章习题
  18. 表格号码归属地查询的正确检测方式
  19. 基于JIRA的产品需求全生命周期管理实践
  20. 在Visual Studio 2010/2012/2013/2015上使用C#开发Android/IOS安装包和操作步骤

热门文章

  1. excel 数据标签格式/数据标签位置没有数据标签外选项
  2. 测试贵在坚持,看一名普通测试人员的经历
  3. 计算机er应该选择保研还是出国?
  4. 计算思维就是指计算机程序 即计算机的思维,[数学思维在计算机程序设计中的体现]计算机思维的本质是指...
  5. VS2019连接SQL Server数据库
  6. 南京邮电大学计算机考研经验
  7. yolo3训练时的问题
  8. 动态规划:砍死怪兽的概率
  9. DCache-CacheServer分析(五)
  10. matlab输入指令错误怎么修改,在MATLAB中运行程序时,显示错误: 此上下文中不允许函数定义。 怎么修改?...