当前位置:   article > 正文

windows网络编程基础学习(1)_windows网络编程基础教程课后实验代码

windows网络编程基础教程课后实验代码
  1. /*
  2. 一、使用winsock的一般步骤
  3. 1.包含winsock头文件
  4. #include<winsock2.h> 其头文件包含了windows.h
  5. 2.链接winsock导入库
  6. 2.1 配置属性-》链接器-》输入-》附加依赖项-》导入库名
  7. 2.2 预处理命令
  8. #pragma comment(lib,"ws2_32.lib")
  9. 3. 加载winsock动态链接库(调用winsock函数的前提)
  10. 需要使用wsastartup()函数,
  11. 返回值为一整数,0:成功, 失败时:
  12. #define WSAEFAULT 10014L
  13. // MessageId: WSAEINVAL
  14. // MessageText:
  15. // An invalid argument was supplied.
  16. #define WSAEINVAL 10022L
  17. // MessageId: WSAEMFILE
  18. // MessageText:
  19. // Too many open sockets.
  20. #define WSAEINPROGRESS 10036L
  21. // MessageId: WSAEALREADY
  22. // MessageText:
  23. // An operation was attempted on a non-blocking socket that already had an operation in progress.
  24. #define WSAEPROCLIM 10067L
  25. // MessageId: WSAEUSERS
  26. // MessageText:
  27. // Ran out of quota.
  28. #define WSASYSNOTREADY 10091L
  29. // MessageId: WSAVERNOTSUPPORTED
  30. // MessageText:
  31. // The Windows Sockets version requested is not supported.
  32. #define WSAVERNOTSUPPORTED 10092L
  33. // MessageId: WSANOTINITIALISED
  34. // MessageText:
  35. // Either the application has not called WSAStartup, or WSAStartup failed.
  36. WSAStartup(_In_ WORD wVersionRequested,_Out_ LPWSADATA lpWSAData);
  37. wVersionRequested:双字节类型,指明winsock库的版本号,高位字节:副版本 低位字节:主版本
  38. 常使用宏 MAKEWORD(a, b) 加载版本,a:副版本 b:主版本
  39. lpWSAData:返回winsock版本的详细信息,为一LPWSADATA结构体指针
  40. typedef struct WSAData {
  41. WORD wVersion; //winsock版本号
  42. WORD wHighVersion; //winsock库支持最高的winsock版本号
  43. #ifdef _WIN64
  44. unsigned short iMaxSockets;
  45. unsigned short iMaxUdpDg;
  46. char FAR * lpVendorInfo;
  47. char szDescription[WSADESCRIPTION_LEN+1];
  48. char szSystemStatus[WSASYS_STATUS_LEN+1];
  49. #else
  50. char szDescription[WSADESCRIPTION_LEN+1]; //加载winsock库说明
  51. char szSystemStatus[WSASYS_STATUS_LEN+1]; //状态和配置信息
  52. unsigned short iMaxSockets; //同时打开的winsock的最大数
  53. unsigned short iMaxUdpDg; //可发送udp数据报的最大字节数
  54. char FAR * lpVendorInfo; //厂商信息
  55. #endif
  56. } WSADATA, FAR * LPWSADATA;
  57. 4.注销winsock动态链接库
  58. 使用函数wsacleanup(void);
  59. 函数无参,成功返回0, 失败时返回socket_error 在winsock2.h中定义,对应值为-1
  60. 二、网络字节顺序(涉及储存时的大端顺序,小端顺序)
  61. 本地:主机字节序
  62. 网络收发:网络字节序
  63. u_short htons(_In_ u_short hostshort);->主机字节序转为网络字节序
  64. hostshort:待转换主机字节序无符号短整型
  65. 返回值:网络字节序的无符号短整型,调用失败返回sockrt_error,错误信息由wsagetlasterror()函数获取。
  66. u_short ntohs(_In_ u_short netshort);->网络字节序转为主机字节序
  67. netshort:待转换网络字节序数据
  68. 返回值:主机字节序数据,调用失败返回sockrt_error,错误信息由wsagetlasterror()函数获取。
  69. u_long htonl(_In_ u_long hostlong);//上面两个是16位数据,此处为32位数据
  70. u_long ntohl(_In_ u_long netlong);
  71. 三、网络地址表示
  72. 1.地址结构
  73. struct in_addr
  74. {
  75. union {
  76. struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b; //常用
  77. struct { USHORT s_w1,s_w2; } S_un_w;
  78. ULONG S_addr;
  79. } S_un;
  80. #define s_addr S_un.S_addr // can be used for most tcp & ip code
  81. #define s_host S_un.S_un_b.s_b2 // host on imp
  82. #define s_net S_un.S_un_b.s_b1 // network
  83. #define s_imp S_un.S_un_w.s_w2 // imp
  84. #define s_impno S_un.S_un_b.s_b4 // imp #
  85. #define s_lh S_un.S_un_b.s_b3 // logical host
  86. } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
  87. struct sockaddr_in
  88. {
  89. short sin_family; //地址族,ip协议对应为af_inet
  90. USHORT sin_port;//16位端口号,网络字节序
  91. IN_ADDR sin_addr; //32位ip地址,网络字节序
  92. CHAR sin_zero[8]; //保留位
  93. } SOCKADDR_IN, *PSOCKADDR_IN;
  94. struct sockaddr
  95. {
  96. u_short sa_family; //协议地址族
  97. CHAR sa_data[14]; // Up to 14 bytes of direct address.
  98. } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
  99. 2.地址转换函数
  100. unsigned long inet_addr(_In_z_ const char FAR * cp);->点分十进制ip地址转换为32位无符号整数。
  101. char FAR * inet_ntoa(_In_ struct in_addr in);->结构变量中的长整型ip地址转换为点分十进制形式。
  102. INT inet_pton(
  103. _In_ INT Family,
  104. _In_ PCSTR pszAddrString,
  105. _When_(Family == AF_INET, _Out_writes_bytes_(sizeof(IN_ADDR)))
  106. _When_(Family == AF_INET6, _Out_writes_bytes_(sizeof(IN6_ADDR)))
  107. PVOID pAddrBuf
  108. );->点分十进制转换为32位网络字节序无符号长整型
  109. PCSTR inet_ntop(
  110. _In_ INT Family,
  111. _In_ const VOID * pAddr,
  112. _Out_writes_(StringBufSize) PSTR pStringBuf,
  113. _In_ size_t StringBufSize
  114. );
  115. 四、网络配置信息
  116. 1.主机名与ip地址
  117. int gethostname(_Out_writes_bytes_(namelen) char FAR * name,_In_ int namelen);->查询本地计算机名字
  118. name:缓冲区,存放主机名字。
  119. namelen:缓冲区大小
  120. struct hostent FAR *gethostbyname(_In_z_ const char FAR * name);-》根据主机名/域名查询ip地址,不支持ipv6
  121. name:所要查询的计算机名字/域名
  122. struct hostent
  123. {
  124. char FAR * h_name; /* official name of host
  125. char FAR * FAR * h_aliases; /* alias list
  126. short h_addrtype; /* host address type
  127. short h_length; /* length of address
  128. char FAR * FAR * h_addr_list; /* list of addresses
  129. #define h_addr h_addr_list[0] /* address, for backward compat
  130. };
  131. INT getaddrinfo(
  132. _In_opt_ PCSTR pNodeName, //指向主机名的指针
  133. _In_opt_ PCSTR pServiceName, //指定查询端口号的服务名称或字符串形式的端口号
  134. _In_opt_ const ADDRINFOA * pHints,
  135. _Outptr_ PADDRINFOA * ppResult
  136. );-》根据主机名/域名查询ip地址,支持ipv6,#include"ws2tcpip.h"
  137. struct hostent FAR * gethostbyaddr(
  138. _In_reads_bytes_(len) const char FAR * addr, //指向网络字节序ip地址的指针
  139. _In_ int len, //地址的长度
  140. _In_ int type //ip地址对应的类型
  141. );-》根据ip查询相关信息
  142. 2.服务器查询
  143. struct servent FAR *getservbyname(
  144. _In_z_ const char FAR * name, //指向服务名的指针
  145. _In_opt_z_ const char FAR * proto //指向协议名的指针(可选)
  146. );->根据给定的服务名和所使用的协议名获取服务的端口号信息
  147. struct servent
  148. {
  149. char FAR * s_name; /* official service name 服务名
  150. char FAR * FAR * s_aliases; /* alias list 服务别名队列
  151. short s_port; /* port # 连接该服务的端口号,以网络字节序排序
  152. char FAR * s_proto; /* protocol to use 使用该服务的所用的传输协议名
  153. };
  154. struct servent FAR * getservbyport(
  155. _In_ int port, //给定的端口号,以网络字节序排序
  156. _In_opt_z_ const char FAR * proto //指向传输协议名的指针,可以为空。
  157. );-》根据给定的协议和端口号查询服务名称等信息
  158. */
  159. //例:查询本机名称及ip(c++ vs2017)
  160. #include<iostream>
  161. #include"WinSock2.h"//包含winsock库头文件
  162. #include"ws2tcpip.h"
  163. #pragma comment(lib,"ws2_32.lib")//链接winsock导入库
  164. using namespace std;
  165. int main()
  166. {
  167. //加载winsock DLL
  168. WSADATA wsaData;
  169. if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  170. {
  171. cout << "加载winsock DLL失败..." << endl;
  172. return 0;
  173. }
  174. char hostname[256];
  175. if (gethostname(hostname, sizeof(hostname)))
  176. {
  177. cout << "获取主机名字失败..." << endl;
  178. WSACleanup();
  179. return 0;
  180. }
  181. cout << "本机名字为:" << hostname << endl;
  182. //根据主机名字查询主机ipv4地址
  183. struct addrinfo hints, *p_addrinfo, *p;
  184. memset(&hints, 0, sizeof(hints));
  185. hints.ai_family = AF_INET;//ipv4地址
  186. unsigned int retval = getaddrinfo(hostname, NULL, &hints, &p_addrinfo);
  187. if (retval != 0)
  188. {
  189. cout << "get addrinfo failed with error: " << int(retval) << endl;
  190. WSACleanup();
  191. return 1;
  192. }
  193. //输出ip地址
  194. p = p_addrinfo;
  195. cout << "本机ip地址为: ";
  196. char ipaddr[20];
  197. in_addr addr;
  198. while (p != NULL)
  199. {
  200. addr = ((sockaddr_in*)(p->ai_addr))->sin_addr;
  201. cout << inet_ntop(AF_INET, (void*)&addr, ipaddr, 20) << endl;
  202. p = p->ai_next;
  203. }
  204. WSACleanup();
  205. return 0;
  206. }

 


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/172157
推荐阅读
相关标签
  

闽ICP备14008679号