网络编程之“一切皆socket”

1:内网访问:通过内网IP直接访问,例:ping

ip号


   外网访问:通过域名(ip号)+端口号访问例:http://www.bilibili.com--这就是域名

   补充:TCP在第一次寻路成功之后就会建立一条传输通道,虽然该通道不是实际存在的,但是以后的数据传输默认了一条传输通道,以太网帧格式在ip数据报前加了源地址与目的地址,该地址指的是mac地址实则就是每台电脑的网卡地址,ip地址(32位)在网络环境中唯一标识一台主机,mac地址应该是在硬件中唯一标识一台主机。192.168.0.0是局域网Ip范围。

NAT映射与打洞机制??


在通信通道还没建立之初,接受的目的mac地址能得到吗?不能,所以需要通过arp请求获得下一跳的MAC地址(16位)





  2:网络字节序的转换

     大端存储:低地址存高位(网络数据流使用的大端字节序)

     小端存储:低地址存地位(计算机是小端字节序)

   字节序的转换函数:



3:ip地址转换函数


[if !supportLists]a.      [endif]点分十进制字符串转网络参数函数:int inet_pton(int af,const char *arc,void *dst),其中af—ip地址族协议,分别是AF_INET(ipv4)or AF_INET6(ipv6);

Src—传原地址,即点分十进制的字符串

Dst—传出参数,直接被分装成void *的类型

[if !supportLists]b.      [endif]网络字节序转点分十进制字符串函数:const char *inet_ntop(int af,const void *src,char *dst,socklen_t  size)

Src—网络字节序

Dst—字符串指针的位置

Size—字符串存储的空间大小

4:socksddr数据结构



[if !supportLists]a.      [endif]需要强制性转参类型的函数

[if !supportLists]b.      [endif]Struct sockaddr_in结构体的内容:


Sin_port—传端口号(字节序转换)

Sin_addr—传ip地址(字节序转换)


5:网络编程=socket编程:二进制+IP+端口通讯的一种模式


[if !supportLists]a.      [endif]在不同主机之间的通信现采用的均是socket接口,在该接口下提供了很多供应用层使用的接口函数,该接口是传输层提供给应用层调用本层方法的类似于函数的接口。不同的主机进程之间通信,由ip地址(网络层)确定唯一主机的位置,再由进程的端口号(传输层)确认进程的位置。

[if !supportLists]b.      [endif]Socket必须成对出现,一个在发送端,一个在接受端;socket在使用时必须绑定ip和端口号;在socket在Linux的内核实现比较复杂,,一个文件描述符指向两个文件缓冲区

[if !supportLists]c.      [endif]

在网络环境中唯一标识的进程就是一个socket,在使用socket时c语言的头文件必须包含:

#Include

#include

<sys/socket.h>

[if !supportLists]d.      [endif]socket的使用:

int socket(int domain, int type, int protocol);

domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。

type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等(socket的类型有哪些?)。

SOCK_STREAM—流式套接字,用到的传输层协议是TCP

SOCK_DGRAM—数据包套接字,用到的传输层协议是UDP

SOCK_RAW—原始套接字

protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议(这个协议我将会单独开篇讨论!)。

注意:并不是上面的type和protocol可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默认协议。

补充:在socket()函数创建成功之后,函数会返回一个socket的文件描述符,失败返回-1

6.

到底这里面的

套接字socket是跟接受端的ip、端口号绑定还是跟发送端的端口号绑定?自己理解应该是绑定自己的ip与端口号

7. 

8. 服务器调用与客户端建立连接的函数

9. 客户端调用的建立连接的函数

 Conststruct sockaddr *addr—里面放的是服务器的ip与端口号


10.C/S模型的流程图





[endif]

Socket()

[if !mso]

[endif] 

任何一个socket都需要与ip和端口号绑定才能通信,但是在客户端,没有调用bind()函数操作系统可以自动绑定一个ip与端口号,但是服务器不能自动绑定,因为自动绑定时我们在客户端申请建立连接调用connect()函数时无法得只服务器的ip与端口号,所以服务器的ip与端口号需要自己设置绑定。

11:服务器代码实例

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 6,399评论 0 6
  • Linux系统的一大特点是它的网络编程能力十分强大, 学习它, 让我们真正体会网络的魅力! 一. 客户机/服务器模...
    刘元旺阅读 11,563评论 0 5
  • Socket创建函数 socket.socket(socket_family, socket_type, prot...
    JianMing阅读 11,195评论 1 13
  • Socket基础概念 网络中进程之间如何通信? 网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则...
    DiamondsAndRust阅读 10,196评论 2 54
  • 杨慧霞 洛阳 焦点讲师班二期 坚持分享第1056天 单位任务越来越重,压力也越来越大。常常想好了干什么,结...
    yhx慧心慧语阅读 803评论 0 0