我们知道BSD Socket是标准的套接字规范,那么怎么在windows使用他们呢?

我们首先要引用<winsock2.h>和ws2_32.lib

然后,执行WSAStartup

  1. #ifdef _WIN32
  2. WORD wVersionRequested;
  3. WSADATA wsaData;
  4. wVersionRequested = MAKEWORD(1, 1);
  5. iStatus = WSAStartup(wVersionRequested, &wsaData);
  6. if (iStatus != 0) {
  7. return 0;
  8. }
  9. if (LOBYTE(wsaData.wVersion) != 1 ||
  10. HIBYTE(wsaData.wVersion) != 1) {
  11. WSACleanup();
  12. return 0;
  13. }
  14. #endif

WSAStartup函数

  1. int WSAStartup(
  2. _In_ WORD wVersionRequested,
  3. _Out_ LPWSADATA lpWSAData
  4. );

最后,执行关闭socket、清理工作

  1. #ifdef _WIN32
  2. closesocket(sockfd);
  3. WSACleanup();
  4. #endif

WSACleanup函数

  1. int WSACleanup(void);

以下程序在Win7 + VC10下编译通过

    客户端程序:

  1. // prjClt.cpp : Defines the entry point for the console application.
  2. //
  3. /**
  4. * Networking program is Win version with BSD Socket
  5. * Client side
  6. *
  7. * Author: xiaobin
  8. * Date: 2013-12-12
  9. */
  10. #include "stdafx.h"
  11.  
  12. #ifdef _WIN32
  13. #include <winsock2.h>
  14. #include <ws2tcpip.h>
  15. #pragma comment(lib, "ws2_32.lib")
  16. #else
  17. #include <sys/socket.h>
  18. #include <netinet/in.h>
  19. #include <arpa/in.h>
  20. #endif
  21.  
  22. #define MAXLINE 254
  23. #define DEFAULT_PORT 3293
  24.  
  25. int main(int argc, char* argv[])
  26. {
  27. int sockfd;
  28. struct sockaddr_in servaddr;
  29. int iStatus;
  30. char *sendBuff = "this is test message!";
  31.  
  32. #ifdef _WIN32
  33. WORD wVersionRequested;
  34. WSADATA wsaData;
  35. wVersionRequested = MAKEWORD(1, 1);
  36. iStatus = WSAStartup(wVersionRequested, &wsaData);
  37. if (iStatus != 0) {
  38. return 0;
  39. }
  40. if (LOBYTE(wsaData.wVersion) != 1 ||
  41. HIBYTE(wsaData.wVersion) != 1) {
  42. WSACleanup();
  43. return 0;
  44. }
  45. #endif
  46.  
  47. if (argc != 2)
  48. printf("Usage: <IPaddress>>\n");
  49.  
  50. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  51. if (sockfd < 0)
  52. printf("socket error\n");
  53.  
  54. /* check Server address */
  55. // inet_pton is win version - InetPton
  56. if (InetPton(AF_INET, argv[1], &servaddr.sin_addr) < 0)
  57. printf("inet_pton error for %s", argv[1]);
  58.  
  59. /* Set serveraddr */
  60. memset(&servaddr, 0, sizeof(servaddr));
  61. servaddr.sin_family = AF_INET;
  62. servaddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
  63. servaddr.sin_port = htons(DEFAULT_PORT);
  64.  
  65. printf("%s%s%s\n", "Connecting ", argv[1], " ...");
  66.  
  67. /* connect server */
  68. iStatus = connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
  69. if ( iStatus < 0 ) {
  70. closesocket(sockfd);
  71. printf("connect error\n");
  72. }
  73.  
  74. printf("%s\n", "Writing...");
  75. /* Write data */
  76. iStatus = send(sockfd, sendBuff, (int)strlen(sendBuff), 0);
  77. if (iStatus < 0) {
  78. printf("%s\n", "write data error");
  79. }
  80. printf("%s\n", "Writed.");
  81.  
  82. #ifdef _WIN32
  83. closesocket(sockfd);
  84. WSACleanup();
  85. #endif
  86.  
  87. return 0;
  88. }

注意:InetPton函数只能在Windows Version >=6上实现!

服务器端程序:

  1. // prjSrv.cpp : Defines the entry point for the console application.
  2. //
  3. /**
  4. * Networking program is Win version with BSD Socket
  5. * Server side
  6. *
  7. * Author: xiaobin
  8. * Date: 2012-12-18 23:35
  9. */
  10. #include "stdafx.h"
  11.  
  12. #ifdef _WIN32
  13. #include <winsock2.h>
  14. #pragma comment(lib, "ws2_32.lib")
  15. #else
  16. #include <sys/socket.h>
  17. #include <netinet/in.h>
  18. #include <arpa/in.h>
  19. #endif
  20.  
  21. #define DEFAULT_BUFLEN 128
  22. #define DEFAULT_PORT 3293
  23.  
  24. int main(int argc, char* argv[])
  25. {
  26. int srvSock, client;
  27. struct sockaddr_in addrSrv;
  28. int iStatus;
  29. int len;
  30. char buff[DEFAULT_BUFLEN];
  31.  
  32. #ifdef _WIN32
  33. WORD wVersionRequested;
  34. WSADATA wsaData;
  35. wVersionRequested = MAKEWORD(1, 1);
  36. iStatus = WSAStartup(wVersionRequested, &wsaData);
  37. if (iStatus != 0) {
  38. return 0;
  39. }
  40. if (LOBYTE(wsaData.wVersion) != 1 ||
  41. HIBYTE(wsaData.wVersion) != 1) {
  42. WSACleanup();
  43. return 0;
  44. }
  45. #endif
  46.  
  47. srvSock = socket(AF_INET, SOCK_STREAM, 0);
  48.  
  49. addrSrv.sin_family = AF_INET;
  50. addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  51. addrSrv.sin_port = htons(DEFAULT_PORT);
  52.  
  53. bind(srvSock, (struct sockaddr *)&addrSrv, sizeof(addrSrv));
  54. listen(srvSock, 5);
  55.  
  56. len = sizeof(struct sockaddr);
  57.  
  58. while(1) {
  59. client = accept(srvSock, (struct sockaddr *)&addrSrv, (int *)&len);
  60. iStatus = recv(client, buff, DEFAULT_BUFLEN, 0);
  61. if (iStatus > 0)
  62. printf("%s\n", buff);
  63. }
  64.  
  65. #ifdef _WIN32
  66. closesocket(client);
  67. closesocket(srvSock);
  68. WSACleanup();
  69. #endif
  70.  
  71. return 0;
  72. }

参考文献:

1. 《Unix 网络编程系列01》 - xiaobin

2. 《Unix 网络编程系列05》 - xiaobin

3. 《网络编程client和server》 - xiaobin

4. WSAStartup - Microsoft Developer Network

5. WSACleanup -  Microsoft Developer Network

6. InetPton - Microsoft Developer Network

使用BSD socket编写Windows版的网络程序的更多相关文章

  1. 使用Code::blocks在windows下写网络程序

    使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...

  2. 【总结】学习Socket编写的聊天室小程序

    1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ...

  3. 如何编写一个稳定的网络程序(TCP)

    本节我们看一下怎样才能编写一个基于TCP稳定的客户端或者服务器程序,主要以试验抓包的方式观察数据包的变化,对网络中出现的多种情况进行分析,分析网络程序中常用的技术及它们出现的原因,在之后的编程中能早一 ...

  4. 编写windows版ANE

    1.编写WinANE.dll: #include <windows.h> #include <stdlib.h> #include <FlashRuntimeExtens ...

  5. 【RL-TCPnet网络教程】第20章 RL-TCPnet之BSD Socket客户端

    第20章      RL-TCPnet之BSD Socket客户端 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...

  6. 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器

    第19章      RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...

  7. 操作系统,windows编程,网络,socket

    首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改. 这十几天学了点关于操作系统.windows编程和网络,主要 ...

  8. Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

  9. 伯克利套接字(BSD Socket)

    http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...

随机推荐

  1. boost::thread 线程锁

    1.boost锁的概述: boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁. 2.mutex对象类(主要有两种): 1.boost::mutex(独占互斥类) --& ...

  2. C++重载流插入运算符和流提取运算符【转】

    C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是 ...

  3. css3学习--css3动画详解一(animation属性)

    ***介绍的属性并不完全,写的都是我认为容易混淆的难点属性,所以属性会在最后综合案例展示~ 一.Keyframes介绍: Keyframes被称为关键帧,其类似于Flash中的关键帧.在CSS3中其主 ...

  4. 帝国cms在任意位置调用指定id的栏目名称和链接

    注意,这个代码无须放在灵动标签中,直接写入模板相应的位置就行了.[1]调用栏目名称: <?=$class_r[栏目ID]['classname']?>   示例:<?=$class_ ...

  5. ubuntu chm文档阅读

    四种方法在Ubuntu下查看CHM文件 来源:http://os.51cto.com/art/201108/287748.htm Ubuntu是一个以桌面应用为主的Linux操作系统,刚开始使用Ubu ...

  6. iOS 实现脉冲雷达以及动态增减元素 By Swift-感谢分享

    Swift经过Xcode6 Beta4一版更新后,基本上已经可以作为生产工具了,虽然有一些地方和ObjC比起来要“落后”一些,但也无伤大雅.这里就用Xcode6 Beta4+iOS SDK 8.0开发 ...

  7. VS2012编译生成XP可以执行的程序

    首先需要的就是下载VS2012的Update 4更新包,然后打开项目的属性页,在 配置属性->平台工具集 选项中选择 Visual Studio 2012 - Windows XP (v110_ ...

  8. ZooKeeper系列之八:ZooKeeper的简单操作

    http://blog.csdn.net/shenlan211314/article/details/6187035 1 )使用 ls 命令来查看当前 ZooKeeper 中所包含的内容: [zk: ...

  9. 修改Delphi工具控件的默认字体

    修改Delphi工具控件的默认字体: 注册表: Delphi 6:    HKEY_CURRENT_USER\Software\Borland\Delphi\6.0Delphi 7:    HKEY_ ...

  10. ssh 认证指定端口

    [root@database2 ~]# cat ssh.sh if [ ! $# -eq 2 ] ;then echo "请输入用户密码以空格分开" exit else ssh-k ...