源程序:
#undef UNICODE
#undef _UNICODE
#include <winsock2.h>
#include <stdio.h>
int main(){
char *straddr = "203.211.218.102:9190";
char addrbuf[50];
SOCKADDR_IN servaddr;
int size=0;
WSADATA WSAdata;
WSAStartup(MAKEWORD(2,2), &WSAdata);
size = sizeof(servaddr);
WSAStringToAddress(straddr, AF_INET, NULL, (LPSOCKADDR)&servaddr, &size);
size = sizeof(addrbuf);
WSAAddressToString(
(SOCKADDR*)&servaddr, sizeof(servaddr), NULL, addrbuf, &size);
printf("secnd conv result %s\n", addrbuf);
WSACleanup();
return 0;
}
***编译后出现了此错误:
[Error] invalid conversion from ‘int*’ to ‘LPDWORD’ {aka ‘long unsigned int*’} [-fpermissive]
翻译是:从int到LPDWORD转换无效{也称为无符号长整形}**
我们先看第一个函数WSAStringToAddress 我们按ctrl点击这个函数

*再用上面方法点击LPINT可以发现 typedef int *PINT,*LPINT;
LPINT是一个指向int类型的指针 所以WSAStringToAddress在最后一个参数可以传入size的地址
我们再来看WSAAddressToString

最后一个参数为LPDWORD 再点击看看
typedef DWORD *PDWORD,*LPDWORD;
typedef unsigned long DWORD;
DWORD是一个无符号长整型 也就是说你要传入的size必须是DWORD的类型或者无符号长整型,而不是int *类型
那么我们就可以用两个变量,一个用int类型,一个用DWORD类型(或者unsigned long )
#undef UNICODE
#undef _UNICODE
#include <winsock2.h>
#include <wininet.h>
#include <stdio.h>
int main(){
SOCKADDR_IN servaddr;
char *straddr = "203.211.218.102:9190";
char addrbuf[50];
DWORD size=0;
WSADATA WSAdata;
WSAStartup(MAKEWORD(2,2), &WSAdata);
int sizew = sizeof(servaddr);
WSAStringToAddress(straddr, AF_INET, NULL, (LPSOCKADDR)&servaddr, &sizew);
size = sizeof(addrbuf);
WSAAddressToString(
(SOCKADDR*)&servaddr, sizeof(servaddr), NULL, addrbuf, &sizew);
printf("secnd conv result %s\n", addrbuf);
WSACleanup();
return 0;
}
然后就可以编译了,结果为: secnd conv result 203.211.218.102:9190