winsock

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)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值