C++ 网络编程之初体验
Win socket 编程开始:
// test.cpp : 定义控制台应用程序的入口点。
//
#include "StdAfx.h"
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")
void initSocket(BYTE,BYTE);//申明方法 initSocket
void cleanSocket();//申明方法 cleanSocket
int main()
{
initSocket(2,2);
//初始化 方法体
charHost[256];
//定义 一个长度为256 的char类型数组
::gethostname(Host,256);
//获取进程所在机器的计算机的名字
hostent*pHost=::gethostbyname(Host);
//gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的
hostent结构指针。结构的声明与gethostaddr()中一致。
/*结构体
structhostent {
char*h_name;
char**h_aliases;
inth_addrtype;
inth_length;
char**h_addr_list;
#defineh_addr h_addr_list[0]
};
*/
in_addraddr;
/*
structin_addr {
in_addr_ts_addr;
};
结构体in_addr 用来表示一个32位的IPv4地址.
*/
for(int i=0;;i++)
{
char*p=pHost->h_addr_list[i];
if(p == NULL)
break;
//memcpy()是什么?
memcpy(&addr.S_un.S_addr,p,pHost->h_length);
//从源 p 所指的内存地址的起始位置开始拷贝n个字节到目标
&addr.S_un.S_addr 所指的内存地址的起始位置中
char*Ip=::inet_ntoa(addr);
/*
结构: charFAR * inet_ntoa( struct in_addr in);
功能: 将一个IP转换成一个互联网标准点分格式的字符串。
*/
printf("\t本机IP地址%d:%s\n",i+1,Ip);
}
cleanSocket();
return0;
}
void initSocket(BYTE minorVer,BYTE majorVer)
{
WSADATAwsaData;
/*
structWSAData {
WORDwVersion;
WORDwHighVersion;
charszDescription[WSADESCRIPTION_LEN+1];
charszSystemStatus[WSASYSSTATUS_LEN+1];
unsignedshort iMaxSockets;
unsignedshort iMaxUdpDg;
char*lpVendorInfo;
};
WSADATA结构被用来保存AfxSocketInit函数返回的WindowsSockets
初始化信息。
*/
WORDsockVersion = MAKEWORD(minorVer,majorVer);//unsigned short
/*
MAKEWORD
MAKEWORD宏 平台:SDK
这个宏创建一个无符号16位整形,通过连接两个给定的无符号参数
。
(注:typedef unsigned short WORD;)
编辑本段
函数原型
WORDMAKEWORD(
BYTEbLow, //指定新变量的低字节序;
BYTEbHigh //指定新变量的高字节序;
);
*/
if(::WSAStartup(sockVersion,&wsaData)!=0)
{
/*返回int 整形
sockVersionAPI提供的调用方可使用的最高版本号.高位
字节指出副版本(修正)号,低位字节指明主版本号.
&wsaData指向WSADATA数据结构的指针,用来接收Windows
Sockets实现的细节.
*/
exit(0);
}
}
void cleanSocket()
{
::WSACleanup();//终止Winsock 2 DLL (Ws2_32.dll) 的使用.
/*
功能
终止Winsock 2 DLL (Ws2_32.dll) 的使用.
头文件
#include<Winsock2.h>
引用库
#pragmacomment(lib, "ws2_32.lib")
静态加入一个lib文件也就是库文件ws2_32.lib文件,提供相关API
的支持,否则需要动态载入ws2_32.dll。
函数原型
intPASCAL FAR WSACleanup (void);
返回值
操作成功返回值为0;否则返回值为SOCKET_ERROR,可以通过调用
WSAGetLastError获取错误代码。
在一个多线程的环境下,WSACleanup()中止了WindowsSockets在
所有线程上的操作.
*/
}