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

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

然后,执行WSAStartup

	#ifdef _WIN32
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
iStatus = WSAStartup(wVersionRequested, &wsaData);
if (iStatus != 0) {
return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return 0;
}
#endif

WSAStartup函数

int WSAStartup(
_In_ WORD wVersionRequested,
_Out_ LPWSADATA lpWSAData
);

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

    #ifdef _WIN32
closesocket(sockfd);
WSACleanup();
#endif

WSACleanup函数

int WSACleanup(void);

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

    客户端程序:

// prjClt.cpp : Defines the entry point for the console application.
//
/**
* Networking program is Win version with BSD Socket
* Client side
*
* Author: xiaobin
* Date: 2013-12-12
*/
#include "stdafx.h" #ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/in.h>
#endif #define MAXLINE 254
#define DEFAULT_PORT 3293 int main(int argc, char* argv[])
{
int sockfd;
struct sockaddr_in servaddr;
int iStatus;
char *sendBuff = "this is test message!"; #ifdef _WIN32
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
iStatus = WSAStartup(wVersionRequested, &wsaData);
if (iStatus != 0) {
return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return 0;
}
#endif if (argc != 2)
printf("Usage: <IPaddress>>\n"); sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
printf("socket error\n"); /* check Server address */
// inet_pton is win version - InetPton
if (InetPton(AF_INET, argv[1], &servaddr.sin_addr) < 0)
printf("inet_pton error for %s", argv[1]); /* Set serveraddr */
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
servaddr.sin_port = htons(DEFAULT_PORT); printf("%s%s%s\n", "Connecting ", argv[1], " ..."); /* connect server */
iStatus = connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if ( iStatus < 0 ) {
closesocket(sockfd);
printf("connect error\n");
} printf("%s\n", "Writing...");
/* Write data */
iStatus = send(sockfd, sendBuff, (int)strlen(sendBuff), 0);
if (iStatus < 0) {
printf("%s\n", "write data error");
}
printf("%s\n", "Writed."); #ifdef _WIN32
closesocket(sockfd);
WSACleanup();
#endif return 0;
}

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

服务器端程序:

// prjSrv.cpp : Defines the entry point for the console application.
//
/**
* Networking program is Win version with BSD Socket
* Server side
*
* Author: xiaobin
* Date: 2012-12-18 23:35
*/
#include "stdafx.h" #ifdef _WIN32
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/in.h>
#endif #define DEFAULT_BUFLEN 128
#define DEFAULT_PORT 3293 int main(int argc, char* argv[])
{
int srvSock, client;
struct sockaddr_in addrSrv;
int iStatus;
int len;
char buff[DEFAULT_BUFLEN]; #ifdef _WIN32
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
iStatus = WSAStartup(wVersionRequested, &wsaData);
if (iStatus != 0) {
return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return 0;
}
#endif srvSock = socket(AF_INET, SOCK_STREAM, 0); addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_port = htons(DEFAULT_PORT); bind(srvSock, (struct sockaddr *)&addrSrv, sizeof(addrSrv));
listen(srvSock, 5); len = sizeof(struct sockaddr); while(1) {
client = accept(srvSock, (struct sockaddr *)&addrSrv, (int *)&len);
iStatus = recv(client, buff, DEFAULT_BUFLEN, 0);
if (iStatus > 0)
printf("%s\n", buff);
} #ifdef _WIN32
closesocket(client);
closesocket(srvSock);
WSACleanup();
#endif return 0;
}

参考文献:

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

最新文章

  1. [MongoDB] 32Bit构建上文件大小限制问题
  2. HDU 1712 ACboy needs your help(分组背包)
  3. [转]基于AWS的自动化部署实践
  4. docker 1.8.2 源代码编译
  5. Leetcode 198 House Robber
  6. stream流批量读取并合并文件
  7. 安装VS2015可能出现的问题以及解决方法
  8. HLG 1400 汽车比赛
  9. python学习(5)
  10. POJ3630——简单Trie树
  11. MyBatis 多个查询条件的传递
  12. Spring MVC DispatcherServlet绑定多种URL
  13. sql select case when 语句
  14. Oracle的导入导出 DMP 文件
  15. JVM指令集介绍
  16. OpenCV问题集锦,图片显示不出来,WaitKey(0),imread()不能读图片,未经处理的异常,等问题集合
  17. java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数
  18. eclipse下properties文件中文乱码的解决方案
  19. 痞子衡嵌入式:第一本Git命令教程(6)- 日志(log/reflog/gitk)
  20. 47 【golang】mysql操作

热门文章

  1. 使用微信api接口开发的框架
  2. Jquery效果之固定不动的块
  3. ASP.Net Web 点击链接直接下载 不在浏览器打开
  4. mysql的数据类型int、bigint、smallint 和 tinyint取值范围 及varchar
  5. python【第十一篇】消息队列RabbitMQ、缓存数据库Redis
  6. VC 项目支撑文件解释
  7. socket、tcp、http
  8. 【UVA10603】Fill (构图+最短路)
  9. Spring MVC 解读——@Autowired(转)
  10. Andoir 判断软键盘是否弹出