网络编程笔记入门 1

1.套接字是网络传输用的软件设备,可以看作两个网络程序应用通话时,各自通信连接中的端口(应用程序编程连接口),字节套就相当于座机

2.在LINUX系统中 如何创建套接字呢?

#include<sys/socket.h>

int socket(int A ,int B ,int C)

 用此函数可以创建一个套接字,此函数的第一个代表协议族,第二个参数代表套接字的数据传输方式,第三个参数代表选用的最终的协议

协议族:socket函数中的传输中的协议方式可以大体分为几个族 

为什么确定了协议族还要确定其数据传输方式呢?因为一个协议族有多种数据传输方式,下面以PF_INET为例。

1).第一中数据传输类型是十分常用的 SOCK_STREAM类,面向连接的套接字。

对于该类型的特点是如下

使用该数据类型时 数据传输是有顺序的 先传达的先接受,传输过程中不会有数据损失。对于第三点:用write函数写入信息时和read函数读取信息次数没有太多关系

缓冲区的数据满了 再传送数据也不会造成数据的失去

2).第二种传输类型是面对消息传输 SOCK_DGRAM,   其特点如下:

以上确定了协议族和数据传递方式,为什么还要第三个参数来确定协议呢?

同一协议族有相同方式的数据传输的不同协议,下面还是以PF_INET为例

如上就是socket函数 如果套接字创造成功,则返回套接字的文件描述符.

3.对于两个人打电话,套接字就相当是座机,当有了座机以后,为了通话,就要给座机分配电话号和座机号,同样对于套接字,要完成通话就要给其分配IP地址和端口号,使用如下函数bind

#include<sys/socket.h>
int bind(int socked,struct sockaddr* myaddr,socklen_t addrlen)

为套接字分配地址后,电话就租住装好了,接下来就需要连接电话线和接听。

接下来会讲述IP地址和端口号

1). 为计算机连接网络 必须要给其分配ip地址 ip地址分别为两类。四字节地址组IPV4和16字节地址组IPV6.以下主要讨论IPV4

IPV4的四字节地址由网络地址和主机地址组成,且IPV4地址族分为如下类

正如上 :先传给四字节的目标网络地址 在向相应的主机号传输数据。路由器的工作就是将外网与本网主机相联,进行数据传输。

以下是网络地址的分类

IP仅仅是来区分计算机的,然而对于传输给计算机的信息,我们如何确定要分配给哪个设备呢?计算机内部由NIC(数据传输设备),NIC向计算机内部传数据时用到IP,操作系统会负责把数据传给合适的套接字,这就要利用端口号(通过NIC的数据由端口号,参考端口号分配给合适的套接字)

端口号和网络地址都以结构体表示

上面图片就是调用bind函数 但是注意将struct socket_in转换为sockaddr结构体

struct sockaddr{
sa_family_t  sin_fmily;//地址组
char sa_data[14]; //地址信息
}

以下是对sockaddr的概述:

sockaddr中的地址簇不知仅仅包含IPV4 且sockaddr_in也包含其中的地址族信息

补充:在cpu中向内保存数据方式有两种,解析数据的方式也有两种

在数据传输方面统一为大端序传输(网络字节序格式),小端序系统在传输数据是要先转化为大端序。

TCP/IP 各层协议将字节序定义为大尾,因此TCP/IP协议中使用的字节序通常称之为网络字节序。而cpu内存放数据的方式就称为字节序(按照大小端口,程序可分为大小端程序)。

因为bind函数本质上就是电话线,要将信息发送,所以在填入sockaddr_in结构体前将计算机内信息转化为网络字节序。

网络字节序作为一个标准字节序,如果系统并没有提供相关的转换函数,我们可以通过以下4个宏实现本地字节序和网络字节序的相互转换:
htons(): 将16位无符号整数从本地字节序转换成网络字节序
htonl(): 将32位无符号整数从本地字节序转换成网络字节序
ntohs(): 将16位无符号整数从网络字节序转换成本地字节序
ntohl(): 将32位无符号整数从网络字节序转换成本地字节序

上面是将整数转换为网络字节序,下面介绍将字符串类地址转换为网络字节序。

sockaddr_in中保存地址信息是32为整数类型,比如 如何将200.11.32.32该字符串转化为网络字节序?调用inet_addr函数

#include<arpa/inet.h>
 in_addr_t inet_addr(const char* string)
//此函数再传入字符传时 转化为32位整数类型的同时转化为网络字节序 
//成功时返回大端序32位整型类型 失败返回INADDR_NONE

代码注意 是sockaddr_in中的sin_addr的结构体地址

还有个函数可以将网络字节序转换为字符串类型 函数如下:

注意返回的是指针类型,并且将32位整型转化为网络字节序后是存在sin_addr中的s_addr变量中

一般初始化结构体参数 如下:

上述网络地址初始化是针对的服务器端而不是客户端,对于服务器段是给它IP地址和端口号,而客户段是请求链接服务器的IP地址和端口号,服务器段是通过bind函数,而客户段是通过connect链接


4.对于电话线的连接,采用listen函数

#include<sys/stocked.h>
int listen(int sockfd,int bloklog)

对于此函数,成功返回0,失败返回-1。第一个参数是套接字的文件描述符 第二个代表相应socket可以排队的最大个数

5.当电话线接好以后需要使用accept()函数接受,TCP服务器监听到客户端请求之后,调用accept()函数取接收请求。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd:服务器的socket描述字
addr:客户端的socket地址
addrlen:socket地址的长度

总上,网络编程中接受连接请求的套接字创造过程如下

先调用socked函数创造套接字,调用bind函数分配ip地址和端口号 调用listen函数转化为可接受请求状态 调用accept()函数处理接受请求。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值