今天突然想试下纯socket编程在两个系统上代码重合量有多大,只要不使用VC自定义的宏(比如SOCKET、SOCKADDR等等)感觉代码重合量挺大的。

比如最简单的TCP客户端和服务端对话,在VC中用int取代SOCKET宏,用struct sockaddr_in取代SOCKADDR_IN宏。

然后区别就仅仅是头文件和windows额外加载/关闭套接字库的代码了。

// Unix/Linux
#include <sys/socket.h>
#include <netinet/in.h> // sockaddr_in
#include <arpa/inet.h> // inet_pton int main(int argc, char* argv[])
{
// TODO: 通用代码
}
// Windows
#include <WinSock2.h>
#include <WS2tcpip.h> #pragma comment(lib, "Ws2_32.lib") // windows上不直接支持close关闭文件描述符
#define close closesocket // windows上需要额外加载和关闭socket库
#define LOAD_WIN_SOCK_LIB \
WSAData wsaData; \
if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0) \
err_quit("加载windows套接字库失败!"); \
if (LOBYTE(wsaData.wVersion) != 2 || \
HIBYTE(wsaData.wVersion) != 1) \
{ \
WSACleanup(); \
err_quit("版本号初始化失败"); \
} #define CLOSE_WIN_SOCK_LIB WSACleanup(); int main()
{
LOAD_WIN_SOCK_LIB
// TODO: 通用代码
CLOSE_WIN_SOCK_LIB
}

  

上述两份代码忽略了其他头文件,全局变量的定义和最后的return 0;

err_quit是我直接用APUE的错误处理函数,换成fprintf+exit也可以。

如果只需要一份文件就使用跨平台宏定义了

#ifdef WIN32
// TODO: WINDOWS平台的特定代码
#else
// TODO: LINUX平台的特定代码
#endif

然并卵,说到底在windows上写只为了交作业,而且windows还提供了CAsyncSocket和CSocket等等,没必要执着于跨平台。

将socket程序从linux移植到windows上的更多相关文章

  1. rsync (windows 服务端,linux客户端)将windows上的数据同步到linux服务器,反之也可

    一:总体概述. 1.windows上面首先装CW_rsync_Server.4.1.0_installer,安装时要输入的用户名密码要记住哦!接下来就是找到rsyncd.conf进入配置细节 2.li ...

  2. 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...

  3. 将Linux代码移植到Windows的简单方法

    一.前言 Linux拥有丰富各种源代码资源,但是大部分代码在Windows平台情况是无法正常编译的.Windows平台根本无法直接利用这些源代码资源.如果想要使用完整的代码,就要做移植工作.因为C/C ...

  4. .Net程序在linux mono环境和WindowsServer上执行测试对比

    最近研究了一下mono,想把windows上写的.Net程序移植到linux上跑.网上有资料说Linux上mono执行.Net程序效率比Windows高,本着实证的态度,只有实际验证过才有说服力. 写 ...

  5. LEDAPS1.3.0版本移植到windows平台----HuCal定标模块

    这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. HuCal是将LEDAPS项目中的TM/E ...

  6. vmware里面的linux怎么和windows相互传文件

    我们常常遇到这样的问题.高版本号的vmware遇到低版本号的linux.使用起来就比較抠脚,比方低版本号的linux安装在高版本号的vmware里. 1.不能全屏显示虚拟机 2.每次切换出来.总要按一 ...

  7. 写一个Windows上的守护进程(5)文件系统重定向

    写一个Windows上的守护进程(5)文件系统重定向 在Windows上经常操作文件或注册表的同学可能知道,有"文件系统/注册表重定向"这么一回事.大致来说就是32位程序在64位的 ...

  8. Windows下与Linux下编写socket程序的区别 《转载》

     原文网址:http://blog.chinaunix.net/uid-2270658-id-308160.html [[Windows]] [Windows: 头文件的区别] #include< ...

  9. OpenFastPath(2):原生态Linux Socket应用如何移植到OpenFastPath上?

    版本信息: ODP(Open Data Plane): 1.19.0.2 OFP(Open Fast Path): 3.0.0 1.存在的问题 OpenFastPath作为一个开源的用户态TCP/IP ...

随机推荐

  1. 连接GitHub的方法

    连接到GitHub 首先在本地创建 ssh key: ssh-keygen -t rsa -C "your_email@youremail.com" 后面的 your_email@ ...

  2. linux 字符串查找

    获取指定目录文件名包含指定字符的文件,然后遍历是否有包含特定字符串,有的话打出文件名 #!/bin/sh COMMAND=`find /data/home/ftp/data/20/201704/27/ ...

  3. 公客网beta阶段项目展示

    课程评价网站--公客网 为大学生选课排忧解难 公正客观的评课网站 为大学生提供发表自己看法的平台 为每一门课程打出公正的评分 beta阶段的新功能 beta阶段发布说明 评价的增删改 对课程发表评价 ...

  4. Idea_03_常用快捷键

    一.前言 这一节我们来看下Idea的一些常用快捷键 二.常用快捷键 Alt + Enter 有错误.警告时的提示 Ctrl+Shift+R 全局 打开资源 ctrl + F 在当前文件查找或替换 Ct ...

  5. redis的String类型以及其操作

    Redis的数据类型 String类型以及操作 String是最简单的数据类型,一个key对应一个Value,String类型是二进制安全的.Redis的String可以包含任何数据,比如jpg图片或 ...

  6. Valgrind的Memcheck快速入门

    一.前言        对于C/C++程序员来说,关于内存问题真是让人头痛不已,尤其是内存泄露.使用未初始化的局部变量进行跳转或移动等隐形问题.要求程序员养成良好的编码习惯确实很重要,但是人总会出现稀 ...

  7. PHP use

    PHP 7 use 语句  PHP 7 新特性 PHP 7 可以使用一个 use 从同一个 namespace 中导入类.函数和常量: 实例 实例 // PHP 7 之前版本需要使用多次 use us ...

  8. node中的一些诡异bug

    这种bug一般是监听的端口号被占用了导致的,换个端口号!!!!

  9. Buildroot构建指南--快速上手与实用技巧

    Buildroot官方全英文使用手册的链接是https://buildroot.org/downloads/manual/manual.html,需要知道每一个细节的朋友,可以仔细查阅,这篇文章只是我 ...

  10. 【剑指offer】数组中出现次数超过数组长度一半的数字,C++实现

    原创博文,转载请注明出处! # 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...