今天突然想试下纯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等等,没必要执着于跨平台。

最新文章

  1. Java注释
  2. Junit3断言
  3. 关于c#字典key不存在的测试
  4. Android应用程序开发之图片操作(一)——Bitmap,surfaceview,imageview,Canvas
  5. windows phone (19) 深入了解TextBlock
  6. css小技巧,如何制作一个箭头符号
  7. kibana常用聚合查询DSL语句记录
  8. JAVA实例
  9. Python爬虫基础之正则表达式
  10. 【LeetCode每天一题】Maximum Subarray(最大子数组)
  11. SolrJ的入门
  12. HTML中的table导出为Excel文件
  13. Linux初学 - Centos7忘记root密码的解决办法
  14. view的focusable属性改变设置是否可获取光标
  15. Linux/CentOS服务器 一个网卡绑定多IP地址(永久设置)
  16. Swing用户界面开发工具包开发记录
  17. 0122有关List、Set、Map的练习
  18. python数据分析系列(2)--numpy
  19. Java设计模式(9)——观察者模式
  20. 借助CustomBehaviorsLibrary.dll写出水印效果(转)

热门文章

  1. 关于python中urllib.urlencode的时候出错:UnicodeEncodeError: ‘ascii’的记录
  2. PHP工作笔记:离线执行php任务
  3. is null 和=null的区别
  4. TensorFlow 的使用步骤
  5. Android深入理解JNI(二)类型转换、方法签名和JNIEnv
  6. php 路径问题
  7. topcoder WCNMLGB
  8. Unity的 NavMeshObstacle 的使用详解
  9. bzoj 4570 妖怪
  10. UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)