2017-10-09 167 views
0

我正在尝试使用Winsock API制作一个简单的IRC客户端,我希望为其添加SSL支持。目前,我只是用我重叠的套接字/ O这样的:对WINAPI的本地SSL支持

SOCKET sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0x02, 0x01); 

if (!sock) 
    return; 

struct sockaddr_in ircClient; 

memcpy(&ircClient.sin_addr, he->h_addr_list[0], he->h_length); 
ircClient.sin_family = AF_INET; 
ircClient.sin_port = wPort; 

WSAEVENT hDataEvent = WSA_INVALID_EVENT; 

if (WSAConnect(sock, (sockaddr*)&ircClient, sizeof(ircClient), 0, 0, 0, 0) > 0) { 
    closesocket(sock); 
    return; 
} 

if (wsWSAGetLastError() != 0) { 
    closesocket(sock); 
    return; 
} 

现在,我的理解,支持SSL,我需要WSAConnect()后做SSL握手。我发现旧的互联网帖子说Winsock没有SSL支持。现在是2017年,95%的网站使用SSL。还有没有办法做到这一点?我发现Using Secure Socket Extensions,但它不是SSL。

+0

WinSock本身仍然不支持SSL,为true。但是,Microsoft的[SChannel API](https://msdn.microsoft.com/en-us/library/windows/desktop/aa380123.aspx)可以,您可以将现有的WinSock代码用于SChannel的I /加密的SSL数据。请参阅[使用Schannel创建安全连接](https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa374782.aspx)。否则,请使用第三方SSL库。 OpenSSL非常普遍,它可以在你现有的WinSock代码之上使用(通过它的'BIO' API)。或者,您可以重新编写代码,让它为您处理所有的套接字I/O –

回答

0

我已经使用本机windows API在几年前完成了一些SSL/TLS的标准TCP连接,但我并不熟悉这个特定的“安全套接字扩展”。

我可以推荐使用SSPI。它不会自动将您的套接字转换为SSL,但可以很容易地根据请求生成SSL请求/响应/数据包。 寻找InitializeSecurityContext了解更多信息。