今天突然想试下纯socket编程在两个系统上代码重合量有多大,只要不使用vc自定义的宏(比如socket、sockaddr等等)感觉代码重合量挺大的。
比如最简单的tcp客户端和服务端对话,在vc中用int取代socket宏,用struct sockaddr_in取代sockaddr_in宏。
然后区别就仅仅是头文件和windows额外加载/关闭套接字库的代码了。
// unix/linux
#include
#include // sockaddr_in
#include // inet_pton
int main(int argc, char* argv[])
{
// todo: 通用代码
}
// windows
#include
#include
#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等等,没必要执着于跨平台。
DM7276/DM7275高精度直流电压计的功能特性及特点
英国首个人工智能技术开发出的药物即将进入临床测试阶段 AI制药将获突破
Art-Pi+TMC2209步进电机细分控制测试
电动汽车的平台化
华为智慧屏V65尊爵版开启预售 售价7999元
将socket程序从linux移植到windows上
重磅!新材料技术应用大会即将召开!齐聚30+院士聚焦材料前沿
3公里远程调频发射机电路
数据中心机房供配电系统设计方案
电容过压发热爆炸的原理——冲激电流信号
TCL液晶彩电IPL32C电源与逆变器板维修
燃气表智能化标准的详细解读
几种数字卫星接收机开关电源典型故障检修
前端技术是什么
iPhone8发布会正在直播:iPhone8外观、配色、性能全面升级,银色、金色、灰色无腮红金
浅析应用于智能楼宇的物联网新技术
Zynq Petalinux编译用户自定义系统
型格e:HEV:未来技术发展的大环境
一种简易二极管温度计的制作方法
chatgpt下非端到端方案是否还有意义