博客
关于我
重温网络编程——常识(三)
阅读量:403 次
发布时间:2019-03-06

本文共 2360 字,大约阅读时间需要 7 分钟。

前言

关于一些网络编程的常识整理。

正文

1.网络数据传输到我们的计算机,是如何知道传输给那个应用?

通过端口,所以端口也是不能重复占用的。
2.
下面是sockaddr_in 的定义:

typedef struct sockaddr_in {#if(_WIN32_WINNT < 0x0600)    short   sin_family;#else //(_WIN32_WINNT < 0x0600)    ADDRESS_FAMILY sin_family;#endif //(_WIN32_WINNT < 0x0600)    USHORT sin_port;    IN_ADDR sin_addr;    CHAR sin_zero[8];} SOCKADDR_IN, *PSOCKADDR_IN;

1.sin_family 设置的为地址族

2.sin_port 为端口号,16位也就是两个字节,所以端口范围是1-65535,其中1-1000是系统保留的端口号,但是并不是我们不能用,只是最后不用。
1024-5000: BSD临时端口,一般的应用程序使用1024到4999来进行通讯;
5001-65535: BSD服务器(非特权)端口,用来给用户自定义端口.
3. ip 地址的定义

typedef struct in_addr {        union {                struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;                struct { USHORT s_w1,s_w2; } S_un_w;                ULONG S_addr;        } S_un;#define s_addr  S_un.S_addr /* can be used for most tcp & ip code */#define s_host  S_un.S_un_b.s_b2    // host on imp#define s_net   S_un.S_un_b.s_b1    // network#define s_imp   S_un.S_un_w.s_w2    // imp#define s_impno S_un.S_un_b.s_b4    // imp ##define s_lh    S_un.S_un_b.s_b3    // logical host} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
  1. sin_zero
    只是为了sock_addr_in 的大小与sockaddr 结构体保持一致插入的成员。
    下面是sockadrr 的声明:
typedef struct sockaddr {#if (_WIN32_WINNT < 0x0600)    u_short sa_family;#else    ADDRESS_FAMILY sa_family;           // Address family.#endif //(_WIN32_WINNT < 0x0600)    CHAR sa_data[14];                   // Up to 14 bytes of direct address.} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;

只是因为CHAR sa_data[14];保存ip与端口过于麻烦,多出的部分补充为0,所以引用了sockaddr_in来人性化操作。

5.cpu 向内存中保存数据的方式有两种。

大端序:高位字节存放在低位地址。

小端序:高位字节存放在高位地址。
例如: int32 数字1,二进制 00000000 00000000 00000000 00000001
这种就是大端序。
然后小端序是:00000001 00000000 00000000 00000000
因为我们传递的时候实际上传递的是信号,也就是二进制。
如果大端号遇到小端号,他们接收的数据正确但是理解是不一样的。
所以在传输数据的时候约定全部转换成大端序。
所以有了下面几个函数:

unsigned short htons(unsigned short);unsigned short ntohs(unsigned short);unsigned long htonl(unsigned long);unsigned long htonl(unsigned long);

h:主机字节序

t:to
n:网络字节序
s:short
l:long
之所以有long,因为long在linux 中为4个字节,可以用来转换ip
htons 用来转换端口。
所以传输地址为:

serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);serverAddr.sin_port = htons(atoi(argv[1]));

INADDR_ANY是一个自动获取的内部ip,比如说127.0.0.1,这只是针对只有一个ip地址的情况,如果自己内部虚拟了网络,那么这个最后去手动填写。

实际过程中我们赋值是:

addr='127.0.0.1'inet_aton(addr,&addr_inet.sin_addr);

功能如下:比如说我们写地址的时候是:127.0.0.1

那么这个时候其实我们必须转换为32位的int类型,也就是32byte。
inet_aton就是用来转换的,避免我们手动计算。

转载地址:http://wbskz.baihongyu.com/

你可能感兴趣的文章
上周热点回顾(8.12-8.18)
查看>>
【故障公告】升级阿里云 RDS SQL Server 实例故障经过
查看>>
蹒跚来迟:新版博客后台上线公测
查看>>
上周热点回顾(9.16-9.22)
查看>>
上周热点回顾(11.4-11.10)
查看>>
[网站公告]11月26日00:00-04:00阿里云RDS升级
查看>>
[网站公告]又拍云API故障造成图片无法上传(已恢复)
查看>>
上周热点回顾(12.16-12.22)
查看>>
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了
查看>>
云计算之路-阿里云上:奇怪的CPU 100%问题
查看>>
云计算之路-阿里云上:2014年6月12日12点IIS请求到达量突降
查看>>
上周热点回顾(6.9-6.15)
查看>>
上周热点回顾(6.16-6.22)
查看>>
上周热点回顾(10.20-10.26)
查看>>
上周热点回顾(2.16-2.22)
查看>>
上周热点回顾(3.2-3.8)
查看>>
.NET跨平台之旅:借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息
查看>>
上周热点回顾(7.27-8.2)
查看>>
上周热点回顾(9.28-10.4)
查看>>
上周热点回顾(5.2-5.8)
查看>>