套接字需要捆绑上地址才有用!
识别目标进程要有 1.对方计算机网络地址 IP 2.端口号表现对方计算机的特定进程
字节序故名思义就是字节的顺序的意思。
具体详解可以看这 http://www.ruanyifeng.com/blog/2016/11/byte-order.html
由于网络传输都是指定大端的字节序,所以假如处在小端字节序的环境中可以用函数转换数据。
这4个函数可帮上忙:
#include<arpa/inet.h>
uint32_t htonl(unit32_t hostinit32); 用网络字节序表示
unit16_t htons(unit16_t hostint16);
unit32_t ntohl(unit32_t netint32); 用主机字节序来表示
unit16_t ntohs(unit16_t netint16);
不同域的地址格式不同,所以地址都会被统一转换成通用地址结构sockaddr!
接下来通过一段代码来讲解地址格式!
#include "unp.h"
int main(int argc,char **argv)
{ int sockfd,n;
char recvline[MAXLINE+1];
struct sockaddr_in6 servaddr;
if(argc!=2)err_quit("usage:a.out <IPADDRESS>");
if(sockfd=socket(AF_INET6,SOCK_STREAM,0)<0) err_sys(“socket error”);
//创建套接字sockfd
bzero(&servaddr,sizeof(servaddr));//将servaddr清理一下
servaddr.sin6_family=AF_INET6;
servaddr.sin6_port=hton(13); // 前面提过hton函数,即以网络字节序返回数字13
if(inet_pton(AF_INET6,argv[1],&servaddr.sin6_addr)<=0)err_quit("地址字符串转换成网络字节序二进制格式失败");
if( connet(sockfd,(SA*)&servaddr,sizeof(servaddr) )<0 )err_sys("connect error");
//连接
while( (n=read(sockfd,recvline,MAXLINE))>0 ){//读取
recvline[n]=0;
if(fputs(recvline,stdout)==EOF)
err_sys("fput error");
} if(n<0)err_sys(“read error”);
exit(0);
}
IPV6因特网套接字用结构sockaddr_in6
struck sockaddr_in6{
sa_family_t sin6_family //地址族
in_port_t sin6_port //端口号
unit32_t sin6_flowinfo
struct in6_addr sin6_addr //地址结构in_addr
unit32_t sin6_scope_id //
}
struct_in6_addr{
unit8_t s6_addr[16];
}
在上面例程代码中 用了
#include<arpa/inet.h>
int inet_pton(int domain, const char* str,void addr)
给字符串地址转换成网络字节序二进制地址再赋值给 结构体的 sin6_addr 的属性。
顺带一提 const char* inet_ntop(int domain,const void addr,char *str,socklen_t size);
这个是将网络字节序二进制地址转换成字符串地址!