Windows网络编程基础知识主要包括以下几个方面:
1. 套接字(Socket):套接字是计算机之间进行通信的一种技术,它是网络编程的基础,在Windows中,套接字使用Winsock库来实现,Winsock库提供了一组API,用于创建、管理和操作套接字。
2. 地址族(Address Family):地址族定义了套接字使用的协议,常见的地址族有AF_INET(IPv4)和AF_INET6(IPv6)。
3. IP地址(IP Address):IP地址是互联网上设备的唯一标识,IPv4地址由四个0到255的整数组成,例如192.168.1.1;IPv6地址由8组16进制数字组成,每组4个,例如2001:0db8:85a3:0000:0000:8a2e:0370:7334。
4. 端口号(Port Number):端口号是应用程序与服务器之间的通信通道,常见的端口号范围是0-65535。
5. 超时(Timeout):超时是指在套接字操作没有完成之前,操作系统允许程序等待的最长时间,超时设置可以避免程序长时间阻塞,提高程序的响应速度。
6. 错误处理(Error Handling):套接字编程中可能会遇到各种错误,如连接失败、无法绑定地址等,正确处理这些错误对于保证程序的稳定运行至关重要。
下面是一个简单的Winsock程序示例,实现了一个基本的TCP客户端和服务器:
服务器端代码:
```c++
include
include
include
include
pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0) {
std::cout
return 1;
}
addrinfo hints = {0};
hints.ai_family = AF_UNSPEC; // 使用IPv4或IPv6
hints.ai_socktype = SOCK_STREAM; // TCP协议
hints.ai_protocol = IPPROTO_TCP; // TCP协议
addrinfo* serverAddr = NULL;
result = getaddrinfo("127.0.0.1", "8888", &hints, &serverAddr);
std::cout
WSACleanup();
SOCKET serverSocket = socket(serverAddr->ai_family, serverAddr->ai_socktype, serverAddr->ai_protocol);
if (serverSocket == INVALID_SOCKET) {
std::cout
freeaddrinfo(serverAddr);
result = bind(serverSocket, serverAddr->ai_addr, (int)serverAddr->ai_addrlen);
if (result == SOCKET_ERROR) {
std::cout
closesocket(serverSocket);
result = listen(serverSocket, SOMAXCONN); // 开始监听客户端连接请求
std::cout
SOCKADDR_IN clientAddr;
int clientAddrSize = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &clientAddrSize); // 接受客户端连接请求
if (clientSocket == INVALID_SOCKET) {
std::cout
char buffer[4096] = {'\0'};
int bytesReceived = recv(clientSocket, buffer, sizeof(buffer) - 1, 0); // 从客户端接收数据
if (bytesReceived > 0) {
buffer[bytesReceived] = '\0'; // 确保字符串以NULL结尾
std::cout
} else if (bytesReceived == SOCKET_ERROR) { // 没有收到数据或者发生错误时关闭连接并退出循环
std::cout
closesocket(clientSocket); // 先关闭客户端套接字,再关闭服务器套接字,释放资源并清理WSA环境变量,如果不这样做,可能会导致内存泄漏或其他问题,这里为了简化示例,直接关闭了客户端套接字,在实际应用中,应该先关闭客户端套接字,closesocket函数返回值为SOCKET_ERROR表示出错,其他值表示成功关闭,因此这里的if条件判断需要加上括号,同时在循环外部也需要关闭服务器套接字,还需要添加错误处理和资源释放代码,不要忘记调用WSACleanup函数来清理WSA环境变量,这个函数只能在主线程中调用一次,如果在其他线程中调用了WSAStartup或WSACleanup函数,会导致程序崩溃或无法正常工作,建议将这两个函数的调用放在main函数中,由于Windows平台的特性,需要包含头文件而不是和,最后需要注意的是,这个示例仅适用于Windows平台,如果要在其他平台上运行,需要修改头文件和库文件的名称以及相应的API调用方式。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/51751.html