计算机网络——网络编程套接字

IP协议有两个版本,IPV4 和IPV6,但若每有特殊说明,默认都是指IPV4.
IP地址是在IP协议中,用来标识网络中不同主机的地址。
我们光有IP地址就可以完成通信了嘛?有了IP地址能够把消息发送到对方的机器上,但还是需要有一个其他的标识来区分出,这个程序要给哪个程序进行解析。
认识端口号:
端口号是传输层协议的内容:
端口号是一个2字节16位的整数;
端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理;
IP地址+端口号能够标识网络上的某一台主机的某一个进程。
一个端口号只能被一个进程占用。
网络字节序:内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。那么如何定义网络数据流的地址呢?
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。
Tcp/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据。
如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略,直接发送即可。
为使网络具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以使用一下函数做网络字节序和主机字节序的转换。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。
如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
socket常见API
//创建socket文件描述符(TCP/UDP,客户端+服务器)
int socket(int domain,int type,int protocol);
//绑定端口号
int bind(int socket,const struct sockaddr* address, socklen_t address_len);
//接收请求(TCP,服务器)
int accept(int socket,struct sockaddr* address,socklen_t* address_len);
//建立连接(TCP,客户端)
int connect(int sockfd,const struct ockaddr* addr,socklen_t addrlen);
sockaddr结构
socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPV4,IPV6,以及后面要将的UNIXDomain Socket,然而,各种网络协议的地址格式并不相同。
struct sockaddr:16位地址类型,14字节数据。
struct sockaddr_in :16位地址类型:AF_INET,16位端口号,32位IP地址,8字节填充。
struct sockaddr_un: 16位地址类型:AF_UNIX,108字节路径名。
IPV4和IPV6的地址格式定义在netinet/in.h中,IPV4地址用sockaddr_in结构体表示,包括16位地址类型,16位端口号和32位IP地址。
IPv4.IPV6地址类型分别定义为常数AF_INET,AF_INET6.这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体的内容。
socket API可以都用struct sockaddr*类型表示,在使用的时候需要强制转化成sockaddr_in,这样的好处是通用性,可以接收IPv4,IPv6,以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数。
地址转换函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值