使用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 ...
随机推荐
- js 默认的参数、可变的参数、变量作用域
可以通过arguments对象来实现可变的参数 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. arguments是一个数组对象,可以通过下标来实别参数的位置 ...
- socket+网路编程
1.网络编程: 通过某种计算机语言来实现不同设备间的资源共享和信息传递.计算机网络的创造可能比计算机本身意义更重大!!!(否则,你只能玩单机版游戏 OSI模型 OSI模型定义了不同计算机互联的标准,是 ...
- gocode 安装
1.安装git,将git/bin添加至PATH 2.执行go get -u github.com/nsf/gocode 3.在%GOPATH%/bin/下会生成gocode.exe
- Junit4 架构设计系列(2): Runner.run()与Statement
Overall 系列入口: Junit4 架构设计系列(1): Request,ClassRequest 和 RunnerBuilder 前文中,我们基本理清了Junit4执行Case大体上的Flow ...
- 利用Anaconda安装python后,如何安装opencv-python
利用Anaconda安装python后,想要安装opencv-python,但发现利用opencv-python的官方教程,没法实现opencv的安装 还好看到了另外一篇博客的方法,试一下,果然凑效 ...
- spm使用之二兼谈spm的贱格
上一篇还没写完, 因为我觉得太长了, 影响阅读, 就截断继续写. 因为还没有写到修改 创建模块的模板啊. 之所以想到要修改spm用来创建模块的模板, 是因为, 有一天我突然上不了网了, 发现spm完全 ...
- 30+最佳Ajax jQuery的自动完成插件的例子
在这篇文章中,我们将介绍35个jQuery AJAX的自动完成提示例子. jQuery 的自动完成功能,使用户快速找到并选择一定的价值.每个人都想要快速和即时搜索输入栏位,因为这个原因,许 流行的搜索 ...
- BZOJ 4013 实验比较
Description 小D被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有\(N\)张图片,编号为\(1\)到\(N\).实验分若干轮进行,在每轮实验中,小\(D\)会被要 ...
- Unity与IOS交互
Unity IOS交互 @By 广州小龙 QQ群:63438968 环境:Mac os 10.9.2 Unity 4.2.1f4 Xcode 5.0.2 Unity IOS的交互我写过一个教程 ...
- 提升 DevOps 效率,试试 ChatOps 吧!
本文翻译自文章 To Boost DevOps, Try ChatOps,文中用简单易懂的方式介绍了 ChatOps 的发展和价值,由 OneAPM 工程师编译整理. 当我们谈论 DevOps 时,总 ...