winsock中存储地址的两个结构体
//sockaddr和sockaddr_in的区别
struct sockaddr {
unsigned short sa_family; // 2 bytes address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // 2 bytes e.g. AF_INET, AF_INET6
unsigned short sin_port; // 2 bytes e.g. htons(3490)
struct in_addr sin_addr; // 4 bytes see struct in_addr, below
char sin_zero[8]; // 8 bytes zero this if you want to
};
在联系winsock i/o select 模型的时候,当把select放在线程里面循环操作的时候,就会产生R6010的错误,但是不单独放在线程里面放在函数里面也就是说同一个线程的时候,没有发生错误,在探索过程中又遇到了别的问题
1.打印的ip地址和通过cmd里面 netstat -ano 查找出来的ip对应不上
打印时用到的一些函数
int getsockname(int sockfd,struct sockaddr* localaddr,socklen_t *addrlen);//获取与套接字相关联的本地地址
int getpeername(int sockfd,struct sockaddr* peeraddr,socklen_t *addrlen); //获取与套接字相关联的外地地址,需要在建立连接以后才能使用,也就是在netstat中是
ESTABLISHED状态
另外通过sock获取的ip是存储在sockaddr结构中的,系统使用的就是这种结构的地址,但是当我们需要输出地址的时候,需要转换为sockaddr_in类型,直接转换会报错,可以通过指针来转换
sockaddr addr;
sockaddr_in *addr_v4;
addr_v4 = (sockaddr_in*)&addr;
//同理在bind的时候,我们就对其反向操作
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(5505);
if (bind(sockServer, (sockaddr*)&server, sizeof(server)) != 0)
//类似的还有在accept和connect的时候,总的来说传递参数是用的sockaddr,获取ip和端口使用的是sockaddr_in
AcceptSocket = accept(sockServer, (sockaddr*)&client, &dSize);
while (connect(client, (sockaddr*)&addr_server, sizeof(addr_server)) != 0)