使用BSD socket编写Windows版的网络程序
我们知道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
使用BSD socket编写Windows版的网络程序的更多相关文章
- 使用Code::blocks在windows下写网络程序
使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...
- 【总结】学习Socket编写的聊天室小程序
1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ...
- 如何编写一个稳定的网络程序(TCP)
本节我们看一下怎样才能编写一个基于TCP稳定的客户端或者服务器程序,主要以试验抓包的方式观察数据包的变化,对网络中出现的多种情况进行分析,分析网络程序中常用的技术及它们出现的原因,在之后的编程中能早一 ...
- 编写windows版ANE
1.编写WinANE.dll: #include <windows.h> #include <stdlib.h> #include <FlashRuntimeExtens ...
- 【RL-TCPnet网络教程】第20章 RL-TCPnet之BSD Socket客户端
第20章 RL-TCPnet之BSD Socket客户端 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...
- 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器
第19章 RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...
- 操作系统,windows编程,网络,socket
首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改. 这十几天学了点关于操作系统.windows编程和网络,主要 ...
- Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)
Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...
- 伯克利套接字(BSD Socket)
http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...
随机推荐
- boost::thread 线程锁
1.boost锁的概述: boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁. 2.mutex对象类(主要有两种): 1.boost::mutex(独占互斥类) --& ...
- C++重载流插入运算符和流提取运算符【转】
C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是 ...
- css3学习--css3动画详解一(animation属性)
***介绍的属性并不完全,写的都是我认为容易混淆的难点属性,所以属性会在最后综合案例展示~ 一.Keyframes介绍: Keyframes被称为关键帧,其类似于Flash中的关键帧.在CSS3中其主 ...
- 帝国cms在任意位置调用指定id的栏目名称和链接
注意,这个代码无须放在灵动标签中,直接写入模板相应的位置就行了.[1]调用栏目名称: <?=$class_r[栏目ID]['classname']?> 示例:<?=$class_ ...
- ubuntu chm文档阅读
四种方法在Ubuntu下查看CHM文件 来源:http://os.51cto.com/art/201108/287748.htm Ubuntu是一个以桌面应用为主的Linux操作系统,刚开始使用Ubu ...
- iOS 实现脉冲雷达以及动态增减元素 By Swift-感谢分享
Swift经过Xcode6 Beta4一版更新后,基本上已经可以作为生产工具了,虽然有一些地方和ObjC比起来要“落后”一些,但也无伤大雅.这里就用Xcode6 Beta4+iOS SDK 8.0开发 ...
- VS2012编译生成XP可以执行的程序
首先需要的就是下载VS2012的Update 4更新包,然后打开项目的属性页,在 配置属性->平台工具集 选项中选择 Visual Studio 2012 - Windows XP (v110_ ...
- ZooKeeper系列之八:ZooKeeper的简单操作
http://blog.csdn.net/shenlan211314/article/details/6187035 1 )使用 ls 命令来查看当前 ZooKeeper 中所包含的内容: [zk: ...
- 修改Delphi工具控件的默认字体
修改Delphi工具控件的默认字体: 注册表: Delphi 6: HKEY_CURRENT_USER\Software\Borland\Delphi\6.0Delphi 7: HKEY_ ...
- ssh 认证指定端口
[root@database2 ~]# cat ssh.sh if [ ! $# -eq 2 ] ;then echo "请输入用户密码以空格分开" exit else ssh-k ...