wisock寻址

winsock第一个版本使用sockaddr来强迫使用特定的寻址方式,这样添加其他的协议就不可能了

1 struct sockaddr
2 {
3     u_short sa_family;//地址家族
4     char sa_data[14];//不同的地址家族,不同
5 };

在winscok中 应用程序通过SOCKADDR_IN结构来指定IP地址和端口号

1 struct scockaddr_in{
2     short sin_family;//地址家族
3     u_short sin_port;//端口号
4     struct in_addr sin_addr;//IP地址
5     char sin_zero[8];//空字节 设为0
6 };

端口号:

0 - 1023 :由IANA管理,保留为公共的服务还用

1023 - 49151 : 是普通的用户注册端口号,由IANA列出

49152 - 65535 : 动态/私有的端口号

普通用户应用程序应该选择:1024-49151

自由使用:49 152 - 65 535

sin_addr中描述IP地址:

结构定义如下:

struct in_addr{
    union{
        struct{u_char s_b1,s_b2,s_b3,s_b4;} S_un_b;
        struct{u_short s_w1,sw_2;}S_un_w;
        u_long S_addr;
    }S_un;
};

32位与aa.bb.cc.dd之间的转换,可以通过下面函数完成

unsinged long inet_addr(const char*cp);//aa.bb.cc.dd 转为成为 32位二进制
char * inet_ntoa(struct in_addr in);//将32位二进制 转化成为 aa.bb.cc.dd

字节顺序: Intel x86使用小尾顺序

      TCP/IP统一规定使用  大尾方式 传输数据

时间: 2024-10-24 16:33:13

wisock寻址的相关文章

开放寻址法

//开放寻址法 //散列函数包括线性探测.二次探测.双重探测 #include<iostream> using namespace std; //除法散列法 int h1(int k,int m) {         return k%m;  } //乘法散列法 int h2(int k,int m,float A) {         float fnum=(float)k;         float re=((fnum*A)-(int)(fnum*A))*m;         retur

深入理解Linux内核 - 第二章 内存寻址 01

1,三个地址 逻辑地址,机器语言指令中用来指定一个操作数或一条指令的地址. 线性地址:32位无符号整数,高达4GB.64位的cpu就是64位的线性地址 物理地址:内存芯片级内存单元寻址.老式x86由32位或36位无符号整数表示. 2,MMU内存控制单元 存在一个分段单元的硬件电路将一个逻辑地址转换为线性地址 存在一个分页单元的硬件电路将线性地址转换成一个物理地址. 问题: 1,为什么物理地址能够用36位的地址来表示? 2,为什么是逻辑地址转换成线性地址,再由线性地址转换为物理地址,这3个地址是什

数组指针与二维数组的寻址

引例:已知如下程序 1 #include <stdio.h> 2 main() 3 { 4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; 5 int (*p)[4] = x, k = 1, m, n = 0; 6 for(m=0; m < 2; m++) 7 n += *(*(p+m)+k); 8 printf("%d\n",n); 9 } 试写出程序的输出值.(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在实践中练出

磁盘IO单线程顺序写时最快的,如果多线程写,磁盘的磁头要不断重新寻址,所以写入速度反而会慢

(1) 读写最好还是不要多线程,硬盘读写的速度有限,单线程时已经满负荷了,多线程又会增加线程之间的切换,会增加时间. 如果想增加读写速度,应该增加硬盘,做raid (2)首先是硬盘的写入是串行的,CPU的计算才是并行的,如果你偏重计算那么多线程能提高,要不怎么叫做并行计算呢: 如果侧重存储,除非数据量达到足以体现优势的程度,否则加上线程之间切换的损耗当然会效率更加地下. (3)这个是按照算法来说的,目前来说大多数的算法都是很快的,瓶颈都在磁盘的IO上,我们针对大多数的算法都进行过测试,基本一半以

网络套接字与寻址

1 套接字描述 套接字是通信端点的抽象,创建一个套接字使用如下函数: #include <sys/socket.h> int socket(int domain, int type, int protocol); 返回值:若成功,返回套接字描述符:若出错,返回-1. 参数: domain: 指定通信的特征,包括地址格式,以AF_开头的常数表示地址族(address family): 域 描述 AF_INET IPv4因特网域 AF_INET6 IPv6因特网域 AF_UNIX UNIX域 AF

内存寻址

当使用80x86微处理器时,我们必须区分三种地址: 1.逻辑地址(logical address) 包含在机器语言指令中用来指定一个操作数或者一条指令的地址.由一个段(segment)和偏移量(offset)组成. 2.线性地址(linear addres,也称虚拟地址 virtual address) 是一个32位无符号整型.是我们编程时接触到的都是这种. 3.物理地址(physical address) 用于内存芯片级内存单位元寻址. 内存控制单元(MMU)通过一种称为分段单元(segmen

链路层寻址与 ARP

一. MAC 地址 不是主机或路由器具有链路层地址,而是它们的适配器(即网络接口)具有链路层地址.因此,具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址. 然而,链路层交换机并不具有与它们接口相关联的链路层地址.这是因为链路层交换机的任务是在主机与路由器之间承载数据报:交换机透明地执行该项任务,也就是说,主机或路由器不必明确地将帧寻址到其间的交换机. ? 尽管 MAC 地址被设计为永久的,但用软件改变一块适配器的 MAC 地址是可能的. 二.地址解析协议 因为存在网络层地址和链路层

汇编笔记三【寻址公式】

一.寻址方式一: 立即数寻址:[立即数] 例: 读取内存的值: MOV EAX,DWORD PTR DS:[0xFFFFFFFF] 向内存中写入数据: MOV DWORD PTR DS:[0xFFFFFFFF],eax 获取内存地址: LEA EAX,DWORD PTR:DS[0xFFFFFFFF] 二.寻址方式二: 寄存器寻址:[reg] reg代表寄存器,可以是8个寄存器中的任意一个 例: 读内存中的值: MOV EAX DWORD PTR DS:[ECX] 向内存中写入数据: MOV DW

深入理解Linux内核 第二章 内存寻址

内存地址 当使用80x86微处理器时,必须区分以下三种不同的地址: 1)逻辑地址(logical address),每一个逻辑地址都由一个段(segment)和偏移量(offset或者displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距离. 2)线性地址(linear address),也称虚拟地址(virtual address),是一个32bit无符整数,可以用来表示4G的地址,通常由16制数字表示. 3)物理地址(physical address),用于内存芯片级内