在TCP/IP协议族中,有很多种协议。TCP/IP协议群中的核心协议被设计运行在网络层和传输层,它们为网络中的各主机提供通信服务,也为模型的最高层–应用层中的协议提供服务。其中的TCP和UDP协议就是应用在传输层的协议。

  • IP地址
  • 端口
  • 地址相关的数据结构
  • TCP
    • 概述
    • TCP编程
      • TCP服务器和客户端流程
      • 相关函数接口
  • UDP
    • 概述
    • UDP编程
      • UDP服务器和客户端流程
      • 相关函数接口

IP地址

1. IP地址的作用
  IP地址用来标识网络中的一台主机。
本篇文章主要讨论基于IPV4协议的网络通信。
2. IP地址的格式转换
  IP地址有两种格式:十进制点分形式和32为二进制形式。前者=是大众所熟悉的形式,后者是网络传输中IP地址的存储方式。
十进制点分形式 “192.168.1.1”
32位二进制形式 10111110 10101000 00000001 00000001
IPv4地址转换函数: inet_aton(); inet_addr(); inet_ntoa();

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr address);//返回点分十进制形式in_addr_t inet_addr(const char *cp);//返回二进制地址形式
参数:cp    点分十进制IP地址字符串
返回值:成功返回 转换后的二进制地址形式

端口

  • 端口号是一个无符号短整型,取值范围0-65535;
  • 端口号是一种系统资源,一般0-1023被系统程序所使用
  • TCP端口号和UDP端口号独立,互不影响
      端口号可以用来代表主机内部的某个套接字。换句话说,当一个套接字建立好,需要和某个IP和端口号进行绑定,这样双方才能实现端到端的通信。
  • 字节序是指计算机中多字节整形数据的存储方式。
  • 字节序有两种:大端序和小端序。
    字节序转换函数: htons(); ntohs(); htonl(); ntohl();
h:   主机host
to: 转换
s:  short类型
l:  long类型
n:  network网络#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
参数:hostshort 主机字节序的 16bit数据hostlong  主机字节序的 32bit数据netshort  网络字节序的 16bit数据netlong       网络字节序的 32bit数据
返回值:成功返回 转换后的字节序值,失败返回 -1;

地址相关的数据结构

/* 通常地址结构 */
struct sockaddr {unsigned short sa_family; //地址族 AF_XXXchar sa_data[14];    //14字节的协议地址
}/* Internet协议地址结构 */
struct sockaddr_in
{short int sin_family; //地址族 2bytes
unsigned short int sin_port;    //端口号 2bytes
struct in_addr sin_addr; //IPv4地址 4bytes
unsigned char sin_zero[8]; //填充0 以保持与struct sockaddr同样大小 8bytes
}/* IPv4地址结构 */
struct in_addr {u_int32_t s_addr; /* 按网络字节次序(大端序)的地址 */
};

TCP

概述

  TCP,传输控制协议,是一种面向连接的传输层协议,向应用层提供可靠的面向连接的数据流传输服务。它能提供高可靠性通信(数据无误、数据无丢失、数据无失序、数据无重复到达)。

TCP编程

TCP服务器和客户端流程

相关函数接口

创建套接字:

#include  <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type,  int  protocol);
参数:domain:选择协议族AF_UNIX      UNIX域协议:本地通信AF_LOCAL     同AF_UNIXAF_INET      IPv4协议AF_INET6     IPv6协议AF_ROUTE     路由套接字AF_KEY       密钥管理协议,密钥套接字type:选择套接字类型SOCK_STREAM    流式套接字SOCK_DGRAM 数据包datagram套接字SOCK_RAW  原始套接字protocol:0 (原始套接字除外)
返回值:成功返回 套接字描述符,失败返回 -1;

绑定套接字:

/* bind 函数原型 */
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr  *my_addr,  socklen_t addrlen);
参数:sockfd        套接字描述符my_addr       绑定客户端地址:不同协议族结构体定义不同,传参时需要强转为通用结构体addrlen        客户端地址信息长度返回值:成功返回 0,失败返回 -1;

监听:

#include <sys/socket.h>
int listen(int sockfd, int backlog);
参数:sockfd:    套接字描述符backlog:能够同时监听的客户端个数(不是同时能连接的个数)
返回值:成功返回 0,错误返回 -1;

接收客户端连接请求:

#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:sockfd    socket返回的监听套接字描述符addr   用于保存客户端地址信息,若不需要填NULLaddrlen 客户端地址信息长度,若不需要填NULL
返回值:错误返回 -1,正确返回 用于通信的套接字;

客户端向服务器请求连接:

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:sockfd    套接字描述符addr  服务器端地址addrlen   地址长度
返回值:成功返回 0,失败返回 -1;

发送数据:

#include <sys/types.h>
#include <sys/socket.h>
int send(int sockfd, const void *msg, size_t len, int flags);
参数:sockfd    套接字描述符msg       发送缓冲区的地址len     发送数据的长度flags    一般为 0
返回值:成功返回 实际发送的字节数,失败返回 -1;

接收数据:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数:sockfd    套接字描述符buf       存放接收数据的缓冲区len       接收数据的长度flags    一般为0
返回值:成功返回 实际收到的字节数,失败返回 -1;

UDP

概述

  UDP,用户数据报协议,是一种面向无连接的不可靠传输层协议。具有资源消耗小,处理速度快的特点。
  由于UDP通信之前不需要先建立一个连接,因此UDP应用要比TCP应用更加简单,高效,也能更好的解决实时性问题。

UDP编程

UDP服务器和客户端流程

UDP服务器流程:

  • socket();
  • bind();
  • recvfrom(); / sendto();
  • close();

UDP客户端流程

  • socket();
  • recvfrom(); / sendto();
  • close();
相关函数接口

一些函数同上,介绍两个一般用于UDP接收发送的函数,也可用于TCP。
接收数据:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);参数:sockfd      socket函数的返回值,套接字描述符buf           接收数据的缓冲区地址len           接收数据的大小flags        一般为 0src_addr   发送端的结构体的地址  addrlen     发送端的结构体长度的地址返回值:成功返回接收的字节数,失败返回 -1

发送数据:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
参数:sockfd        socket函数的返回值,套接字描述符buf           发送数据的缓冲区len         发送数据的大小flags        一般为 0dest_addr  接收端的结构体的地址addrlen       接收端的结构体长度的地址
返回值:成功返回发送的字节数,失败返回 -1

Linux 网络编程 TCP/UDP编程相关推荐

  1. [windows网络编程]tcp/udp编程初步详解-转

    #pragma comment (lib,"ws2_32.lib") #include <Winsock2.h> #include <stdio.h> 如你 ...

  2. 网络编程(Tcp/Udp实现聊天、文件上传)

    网络编程 1.1 概述 计算机网络是指将位置不同的多台[计算机 通过通信线路连接起来,实现资源共享和信息传递的计算机系统 1.2 网络通信的要素 ip和端口 网络通信协议(tcp/udp) 1.3 I ...

  3. TCP/UDP编程中的问题汇总

    TCP/UDP编程中的问题汇总 TCP和UDP发送大文件的问题. 答: 发送端: 发送时,先发送文件的名称及大小等信息. 然后,设置一个缓冲区的大小,假设为4K. 再循环读4K的文件内容,并发送,直到 ...

  4. 原生JAVA的TCP/UDP编程

    一.TCP/UDP对比 二.TCP编程 TCP字节流编程 - Server端: public class TCPServerStream {public static void main(String ...

  5. Java TCP/UDP编程

    java TCP & UDP编程 UDP编程 TCP编程 UDP编程 UPD: User Datagram Protocol.面向无连接,不安全. UDP中,发送方无需知道接收方是否接受,只考 ...

  6. 网络编程---TCP/UDP套接字编程原理

    本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的 本篇重在讲解原理,具体实现请戳这里->UDP套接字编程实现 介绍 网络编程套接字(s ...

  7. 【Linux网络编程】UDP编程

    00. 目录 文章目录 00. 目录 01. 概述 02. UDP编程C/S结构 03. UDP常用函数 3.1 sendto函数 3.2 recvfrom函数 3.3 bind函数 04. 程序示例 ...

  8. 网络编程-tcp/udp

    Java网络编程 计算机网络就是通过传输介质.通信设施和网络协议,把分散在不同地点的计算设备互连起来,实现资 源共享和数据传输的系统. TCP/IP协议簇 TCP/IP协议栈是一系列网络协议的总和,是 ...

  9. 【Java】网络编程——TCP/UDP网络对讲机

    目录 前言 OSI概述 传输层 端口 Socket InetAddress类 UDP协议间的通信 UDP协议相关类 UDP 发送端 UDP 接收端 + 发送端 UDP 聊天 + 全局广播 UDP发送大 ...

  10. 网络编程 TCP/UDP

    网络编程 打电话–连接–接了–通话->TCP连接 发短信------发送了就完事了---->UDP连接 网络编程的目的: 传播交流信息,数据交换.资源共享.通信 想要打到这个效果需要什么: ...

最新文章

  1. eclipse新建maven项目_通过Eclipse新建简单动态项目,访问成功
  2. python 结束子线程并保证工作完成_python3中在线程中结束工作进程的方法
  3. vue中什么样的数据可以是在视图中显示
  4. 从2021年多篇顶会论文看OOD泛化新理论、新方法和新讨论
  5. Vue响应式数据: Observer模块实现
  6. rtsp 协议读取视频进行分析并返回结果到websocket server
  7. OV摄像头SCCB通信协议
  8. MySQL主从数据同步延时分析
  9. 计算机辅助设计及工程分析的特点,EDA技术的简单介绍及特点分析
  10. LC振荡器的工作原理
  11. passing ‘const XXX’ as ‘this’ argument discards qualifiers
  12. 另类搞笑:自我指涉例句不完全收集
  13. 平安性格测试题及答案_【中国平安人寿保险平安保险性格测试特别是智商题通过率怎么样】-看准网...
  14. 计算机界的传奇人物:高纳德
  15. SQL Server数据库的管理及维护
  16. 【SegNet】 A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
  17. 数组逆时针旋转 90 度
  18. Qt接入阿里云SDK,OSS工程,实现头像上传,Mac和Win编译库文件。
  19. tomcat上面有红叉解决办法
  20. nvidia深度学习加速库apex简单介绍

热门文章

  1. 使用jsBridge实现H5与原生App交互
  2. JS中编码的三种方法
  3. SQL注入之万能密码
  4. 怎样从excel随机抽取多行
  5. Windows系统注册表
  6. HTML Web教程
  7. 【数学建模】2 TOPSIS优劣解距离法
  8. 让RTL8187无线网卡在linux 2.6.28内核支持aircrack-ng注入。
  9. h3c 链路聚合测试_H3CSE学习之链路聚合
  10. H3CSE园区-RSTP