socket通信:客户端和服务器的简单实现

什么是socket?

socket最开始的含义是一个地址和端口对(ip, port)。Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求

  • socket地址API:它唯一的表示了使用tcp通信的一端,也可以将其理解成socket地址。
  • socket基础API:socket的主要API都定义在sys/socket.h头文件中,包括创建socket,命名socket,监听socket,接收连接,发起连接,读写数据等等。

主机字节序和网络字节序

现代cpu的累加器一次都能装载4字节,即一个整数。那么这四个字节在内存中的排列顺序就会影响它被累加器装载成的整数的值。这就是字节序问题。字节序分为大端字节序和小端字节序。

  • 大端字节序:一个整数的高位字节存储在内存中的低地址处,低位字节存储在内存中的高地址处。
  • 小端字节序:一个整数的高位字节存储在内存中的高地址处,低位字节存储在内存中的高地址处。

现代PC机大多数采用小端字节序,因此小端字节序又被称为主机字节序。当格式化的数据在两台使用不同字节序的主机之间直接传递时(不经过字节序的转换统一),接收端必然错误的解释之。因此人们提出了一种解决办法:发送端总是把要发送的数据转化成大端字节序数据后再发送,而接收端就默认接收到的数据都是采用大端字节序,再根据自身的字节序决定是否对齐进行转化。因此大端字节序也被称为网络字节序

字节序的转换函数

Linux系统提供了如下4个函数来完成主机字节序和网络字节序的转化。

#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);//IP地址从主机字节序转化成网络字节序
unsigned short int htons(unsigned short int hostport);//端口号从主机字节序转化为网络字节序
unsigned long int ntohl(unsigned long int netlong);//IP地址从网络字节序转化为主机字节序
unsigned short int ntohs(unsigned short int netshort);//端口号从网络字节序转化为主机字节序

字节序和socket通信之间的关系:我们知道socket套接字就是两个主机之间通信的方式,需要经过传输层和网络层协议(tcp/ip)来进行数据的传输,而这里就会牵扯到字节序的问题。需要进行字节序的转化才能将正确的数据传出去和接收到。

专用socket地址

TCP/IP协议族有sockaddr_in这个用于IPV4的专用socket地址结构体

struct sockaddr_in
{
    sa_family_t sin_family;        /*地址族:AF_INET*/
    u_int16_t sin_port;            /*端口号:要用网络字节序表示*/
    struct in_addr sin_addr;       /*IPV4地址结构体,见下面*/
};
struct in_addr
{
    u_int32_t s_addr;        /*IPV4地址,要用网络字节序表示*/
};

注意:所有专用socket地址类型的变量在实际使用时都需要

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值