sockets: sockets网络编程基础

全部包含:

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>     

#include <netinet/in.h> 

#include <netinet/tcp.h>  

#include <netinet/sctp.h>

#include <net/if.h>

#include <netdb.h>

tcp/ip协议有四层,ISO协议有七层;

应用层:

传输层:TCP,UDP,SCTP

网络层:IP,ICMP,IGMP

链路层:ARP,RARP

网络相关命令:

netstat

tcpdump

arp

lsof

iptables

ifconfig

ping

traceroute

route

在SVr4系统中编译函数要加链接库socket和nsl:

-lsocket   -lnsl

编译sctp程序需要链接sctp库:

-lsctp

大端小端的问题

小端:低字节在起始地址,高字节在高地址

大端:高字节在起始地址,低字节在高地址

linux一般都是小端

unix一般都是大端

16位数据,由2个字节组成,一个字节在高地址,一个字节在低地址。

32位数据,由4个字节组成,以此类推。

ACK:acknowledgement,确认字符,接收站发给发送站的一种传输类控制字符。

FIN:表示发送结束,关闭连接

SYN:synchronize,握手信号

TCP:为用户进程提供可靠的字节流的全双工的面向连接的传输控制协议。

UDP:不可靠的无连接的用户数据报协议。

SCTP:提供可靠的全双工关联的面向连接的流控制传输协议。

下面的tcp和udp的套接字是传输层的API,由应用层调用;

应用层处于用户态;

传输层、网络层和链路层处于内核态。

socket函数都是posix标准的函数,

sctp是tcp和udp的升级版,尽量使用sctp的API

ipv6是ipv4的升级版,尽量使用Ipv6的API

使用tcp/ip协议的应用程序通常采用两种编程接口:

1.     socket(BSD的socket接口)

2.     TLI或XTI(传输接口, XTI是TLI的超集),现已不用.

###########################################################

网络编程相关库函数:

###########################################################

字节序转换库函数:

客户和服务程序在传输之前,需要将内部整数的表示方式转换成网络字节序。

unix的网络字节序一般是大端,linux的网络字节序一般是小端。

主机字节序十进制整数转换成网络字节序的短整型和长整型:

uint16_t   htons(uint16_t   host16bitvalue);

uint32_t   htonl(uint32_t   host32bitvalue);

网络字节序转换成主机字节序的短整型和长整型:

uint16_t   ntohs(uint16_t   net16bitvalue);

uint32_t   htohl(uint32_t   net32bitvalue);

16位处理端口

32位处理地址

----------------------

字节操纵库函数:

BSD:

#include <strings.h>

void bzero(void *dest, size_t nbytes);

void bcopy(const void *src, void *dest, size_t nbytes);

int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);

ANSIC:

#include <string.h>

void *memset(void *dest, int c, size_t len);

void *memcpy (void *dest, const void *src, size_t nbytes);

int memcmp(const void *ptr1, const void *ptr2, size_t ntbytes);

bzero和memset一般用来将套接字地址初始化为0.

----------------------

网际地址转换库函数:

在 ASCII字符串(点分十进制字符串,人们偏爱的格式)

和 网络字节序的二进制(存放在套接字地址中的值)

之间转换网际地址。

点分十进制(a)也叫表达(p)

网络字节序的二进制(n)也叫数值(n)

将点分十进制字符串转换成32位的网络字节序二进制ipv4地址:

int inet_aton(const char *strptr, struct in_addr *addrptr);

in_addr_t inet_addr(const char *strptr);//一般不再使用该函数

将32为的网络字节序二进制ipv4地址转换成点分十进制字符串:

char *inet_ntoa(struct in_addr inaddr);

同时适用于ipv4和ipv6的两个转换函数(现在一般用这个):

下面两个函数是可重入的。

将点分十进制字符串strptr转换成32位的网络字节序二进制地址addrptr:

int inet_pton(int family, const char *strptr, void *addrptr);

ipv4中void *一般为struct in_addr *也就是&sin_addr.

strptr一般是IP地址。

将32位的网络字节序二进制地址addrptr转换成点分十进制字符串strptr:

const char *inet_ntop(int family, const void *addrptr, char *strptr, size_tlen);

family:

AF_INET   //ipv4

AF_INET6   //ipv6

len:

#define INET_ADDRSTRLEN   16   //ipv4

#define INET6_ADDRSTRLEN   46   //ipv6

-----------------------------------------------------------

ipv4套接字地址结构:

typedef   uint32_t  in_addr_t;   //32位无符号整数

typedef   unsigned short int   sa_family_t;

typedef   uint16_t  in_port_t;

struct in_addr   //ipv4地址结构

{

in_addr_t   s_addr;  //32位二进制的ipv4地址

};

ipv4:

s_addr = htonl(INADDR_ANY);为0,这个通配地址常量为0,内核自己选择地址

struct sockaddr_in   //ipv4网际套接字地址结构,一般定义这个变量

{

uint8_t         sin_len;   //linux 没有这个参数

sa_family_t     sin_family;   //AF_INET

in_port_t       sin_port;   //port number

struct in_addr   sin_addr;   //32 bit ipv4address

char           sin_zero[8];   //unused

};

sin_addr.s_addr = htonl(INADDR_ANY);

sin_port = htons(SERV_PORT);

struct sockaddr   //旧版本通用套接字地址结构,一般套接字函数用这个变量

{

uint8_t       sa_len; //  linux没有这个参数

sa_family_t   sa_family;

char         sa_data[14];

};

将struct sockaddr_in强转成struct sockaddr类型用在套接字api中。

这个是适用于ipv4的与协议无关的通用套接字地址结构。

-------------------------

ipv6套接字地址结构:

struct in6_addr   //ipv6地址结构

{

uint8_t   s6_addr[16];   //128位二进制的ipv6的地址

}

ipv6:

s_addr = htonl(IN6ADDR_ANY_INIT);

struct sockaddr_in6   //ipv6网际套接字地址结构

{

uint8_t          sin6_len;   //lenth of structure

sa_family_t      sin6_family;   //AF_INET6

in_port_t        sin6_port;   //port number

uint32_t         sin6_flowinfo;

struct in6_addr   sin6_addr;   //128 bit ipv6address

uint32_t         sin6_scope_id;

}

struct sockaddr_storage   //新的通用套接字地址结构

{

uint8_t       sa_len;

sa_family_t   sa_family;

….

}

这个是适用于ipv6的与协议无关的通用套接字地址结构。

时间: 2024-08-04 20:54:49

sockets: sockets网络编程基础的相关文章

python全栈开发从入门到放弃之socket网络编程基础

网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 为何学习socket一定要先学习互联网协议: 1.首先:本节课程的目标就是教会你如何基于socket编程,来开发一款自己的C/S架构软件 2.其次:C/S架构的

MFC——10.网络编程基础

Lesson10:网络编程基础 网络编程是计算机编程的一个重要分支,是网络通信的基础,网络编程主要用到了Windows系统系统提供的socket.网络通信又分为基于TCP和基于UDP两种.本文主要讲解基于TCP和UDP的网络编程基础知识. 1.      基于TCP的socket编程 1.1  TCP服务器 #include <winsock2.h> #include <stdio.h> //#include <iostream> #pragma comment(lib

Java网络编程和NIO详解开篇:Java网络编程基础

Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. 对于一个码农而言,了解网络的基础知识可能还是从了解定义开始,认识OSI的七层协议模型,深入Socket内部,进而熟练地

网络编程基础

网络编程基础 1.套接字概念 Linux环境下使用套接字进行进程之间的通信.用过套接字的接口,其他进程的位置对于应用程序来讲是透明的.相互通信双方端点都有一个套接字,双方如果要进行通信,通过套接字建立桥梁,双方就可以通信了. 类似文件一样,套接字也有一个套接字描述符,应用程序可以像操作文件一样操作套接字.在进行网络通信的过程中,用户感觉就是在操作文件一样,这是Linux将外部设备抽象为一个文件的好处. 2.字节序 不同主机的体系结构不同,所采用的数据存储方式不同.网络中,进程之间的通信是跨主机的

iOS开发网络篇—网络编程基础

iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力 (3)如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水 移动网络应用 = 良好的UI + 良好的用户体验 + 实时更新的数据 新闻:网易新闻.新浪新闻.搜狐新闻.腾讯新闻 视频:优酷.百度视频.搜狐视频.爱奇艺视频 音乐

Java网络编程基础(六)— 基于TCP的NIO简单聊天系统

在Java网络编程基础(四)中提到了基于Socket的TCP/IP简单聊天系统实现了一个多客户端之间护法消息的简单聊天系统.其服务端采用了多线程来处理多个客户端的消息发送,并转发给目的用户.但是由于它是基于Socket的,因此是阻塞的. 本节我们将通过SocketChannel和ServerSocketChannel来实现同样的功能. 1.客户端输入消息的格式 username:msg    username表示要发送的的用户名,msg为发送内容,以冒号分割 2.实现思路 实现思路与Java网络

用Netty开发中间件:网络编程基础

用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是非常高,尤其是第一版,第二版能稍好些?入手后高速翻看了大半本,不免还是想对<Netty权威指南(第二版)>吐槽一下: 前半本的代码排版太糟糕了,简直就是直接打印Word的版式似的. 源代码解析部分的条理性和代码排版好多了,感觉比其它部分的质量高多了. 假设你是刚開始学习的人可能会感觉非常具体,差点儿每部分都会来一套client和服务端的Demo.假设你不是入门者的话可能会感觉水分比較多. 最后一部分高级特性

嵌入式 Linux网络编程(一)——Socket网络编程基础

嵌入式 Linux网络编程一--Socket网络编程基础 一.Socket简介 1.网络中进程间通信 本机进程使用进程号区别不同的进程进程间通信方式有管道.信号.消息队列.共享内存.信号量等.网络中进程间的通信首先需要识别进程所在主机在网络中的唯一标识即网络层的IP地址主机上的进程可以通过传输层的协议与端口号识别. 2.Socket原理 Socket是应用层与TCP/IP协议族通信的中间软件抽象层是一种编程接口.Socket屏蔽了不同网络协议的差异支持面向连接(Transmission Cont

Java笔记二十三.网络编程基础与UDP编程

网络编程基础与UDP编程 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.网络编程基础 1.TCP/IP协议:TCP/IP协议是一个非常实用的网络应用程序通信协议,包括TCP(传输控制协议)和IP地址(计算机唯一标识号). 2.IP地址:IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识(身份证),通过这个标识号来指定接收数据的计算机和识别发送数据的计算机,该标识号即为IP地址. (1)Ipv4:指在计算机中IP地址用4个字节(

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只