winsock

2017-09-12 12:15:14来源:CSDN作者:aricover人点击

分享

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)


好吧,打印出来端口又对上了,可能是之前的打印姿势不对

Server:




Client:



netstat -ano



最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台