0端口 0.0.0.0地址
来源:互联网 发布:兔子网络加速器 编辑:程序博客网 时间:2024/06/08 11:08
服务端
socket()
bind() //端口为0的时候表示系统分配端口
//端口号为5050
listen()
accept();
客户端
socket()
connect()
//这里也设置了个端口号5050,书上说客户端和服务器端的端口号必须一样
当客户端进行连接时,我的accept得到个sockaddr_in里面的端口号并不是5050 ?
解答:
服务器用Listen()监听时要指定一个监听端口号,(你的是5050)
客户端用Connect()联接时要指服务器地址以及服务器的提供的联接端口号,(就是上面的5050)
而客户端本机向外联接的端口号由本机随机产生
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
struct in_addr {
unsigned long s_addr;
};
typedef struct in_addr {
union {
struct{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct {
unsigned short s_w1,
s_w2;
} S_un_w;
unsigned long S_addr;
} S_un;
} IN_ADDR;
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化
mysock结构体名
mysock.sa_family=AF_INET;
mysock.sin_addr.s_addr=inet_addr("INADDR_ANY");
……
等到要做转换的时候用:
(struct sockaddr*)mysock
INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。
例如MontiVista Linux中在/usr/include/netinet/in.h定义为:
/* Address to accept any incoming messages. */
#define INADDR_ANY ((in_addr_t) 0x00000000)
一般情况下,如果你要建立网络服务器应用程序,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。——也就是说,你的程序要绑定服务器的某地址,或者说:把服务器的某地址上的某端口占为已用。服务器操作系统可以给你这个指定的地址,也可以不给你。
如果你的服务器有多个网卡(每个网卡上有不同的IP地址),而你的服务(不管是在udp端口上侦听,还是在tcp端口上侦听),出于某种原因:可能是你的服务器操作系统可能随时增减IP地址,也有可能是为了省去确定服务器上有什么网络端口(网卡)的麻烦 —— 可以要在调用bind()的时候,告诉操作系统:“我需要在 yyyy 端口上侦听,所以发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的。”这时候,服务器程序则在0.0.0.0这个地址上进行侦听。
如果我的服务器有N个IP地址,会不会收到重复的数据包?收到数据包后,是不是会重复回复客户端呢?
inet_addr和inet_ntoa函数相反inet_ntoa把类型为struct in_addr的数据转化为"数字+句点"的形式的字符串
typedef u_int32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
本机字节顺序与网络字节顺序的转换
htons ------"host to network short"
htonl -------"host to network long"
ntohs -------"network to host short"
ntohl -------"network to host long"
*注意:在你的数据放到网络上的时候,确信它是网络字节顺序
网络字节顺序(大端字节)和x86机器字节顺序(小端字节)
eg:0X3132 在x86上显示21 在网络传输中为12
- 0端口 0.0.0.0地址
- websphere地址和端口
- 端口地址大全
- x86 IO端口地址
- IP地址和端口
- IP地址和端口
- Tomca7.0t端口和默认ip地址修改
- SOCKET绑定时,端口和地址为0解析
- socket INADDR_ANY 监听0.0.0.0地址 socket只绑定端口让路由表决定传到哪个ip
- socket INADDR_ANY 监听0.0.0.0地址 socket只绑定端口让路由表决定传到哪个ip
- socket INADDR_ANY 监听0.0.0.0地址 socket只绑定端口让路由表决定传到哪个ip
- socket INADDR_ANY 监听0.0.0.0地址 socket只绑定端口让路由表决定传到哪个ip
- I/O端口地址表
- I/O端口地址表
- 获得客户端地址端口等
- I/O端口地址译码
- MAC地址与网络端口
- IP地址与端口号
- U盘文件丢失选择什么数据恢复软件好
- C#中的委托和事件(1)
- setTimeout函数兼容各浏览器运行执行效果 .
- 查询SystemFeature的方法
- RSA算法详解及C语言实现
- 0端口 0.0.0.0地址
- 柱状图中找最大矩形 & 矩阵中找最大的仅含相同值的矩形区域
- 标准C++中的string类的用法总结
- 委托,使用字符串,NSNumber,数组
- 一道算法题
- C#中的委托和事件(2)
- 倒读《西游记》
- linux编程-守护进程编写
- 3个著名加密算法(MD5、RSA、DES)的解析