网络编程其实我一直 停留在tcp 还有 udp 当时 在 大一下学期的时候写了一个TCP实现的局域网下的 五子棋 页面是 直接用 画布画
然后 是 捕获 鼠标的 点击点 然后就直接 完成了一个五子棋 当时想着网络编程感觉很简单 现在感觉还是我太嫩了 其实还是有些难度的 前一段时间在论坛上看了很多 关于病毒的分析 发现了很多的 关于网络编程的东西 有很多 还是不懂
比如很多的模型什么的 不是很理解 然后恰好 kepler 表哥给我买了两本书 其中就是windows 网络与通信设计
然后其中有了例子很不错 (我就直接粘贴了)
#include <windows.h>
#include <stdio.h>
#include "Iphlpapi.h"
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "WS2_32.lib")
/
// 全局数据
u_char g_ucLocalMac[6]; // 本地MAC地址
DWORD g_dwGatewayIP; // 网关IP地址
DWORD g_dwLocalIP; // 本地IP地址
DWORD g_dwMask; // 子网掩码
BOOL GetGlobalData()
{
PIP_ADAPTER_INFO pAdapterInfo = NULL;
ULONG ulLen = 0;
// 为适配器结构申请内存
::GetAdaptersInfo(pAdapterInfo,&ulLen);
pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen);
// 取得本地适配器结构信息
if(::GetAdaptersInfo(pAdapterInfo,&ulLen) == ERROR_SUCCESS)
{
if(pAdapterInfo != NULL)
{
memcpy(g_ucLocalMac, pAdapterInfo->Address, 6);
g_dwGatewayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String);
g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
}
}
printf(" \n -------------------- 本地主机信息 -----------------------\n\n");
in_addr in;
in.S_un.S_addr = g_dwLocalIP;
printf(" IP Address : %s \n", ::inet_ntoa(in));
in.S_un.S_addr = g_dwMask;
printf(" Subnet Mask : %s \n", ::inet_ntoa(in));
in.S_un.S_addr = g_dwGatewayIP;
printf(" Default Gateway : %s \n", ::inet_ntoa(in));
u_char *p = g_ucLocalMac;
printf(" MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]);
printf(" \n \n ");
return TRUE;
}
int main()
{
// 获取全局数据
GetGlobalData();
getchar();
return 0;
}
获取本地的网络信息
然后 这个 Windows套接字的 I/O 模型
书上介绍了这样的几种
第一个是 套接字 模式
是 阻塞 和 非阻塞 然后 非阻塞 在我看起来并不好用
第二个 是 选择模型
选择模型 这个东西 就是自己封装好了一个套接字集合 然后 我们可以用迭代 通过他们提供的函数可以判断状态
这样确实有好处 比如 单线程处理 起来简单 debug 起来也简单 但是 套接字 数量有限
并且 我感觉 如果套接字多了话 也会让程序 效率变得的慢。。
第三个 是 WSAAsyncSelect 模型 这个模型一开始其实我也设想过
没想到真的有 这个模型就是用 Windows消息这个机制来传递 socket 这个想法 其实还是有点奇妙的
但是 也是老生常谈的问题 这样的消息机制 如果多了的话 就凉凉了
而且 这样的话 只能用gui 页面了~~~
第四个模型 就是WSAEventSelect模型
这个