将socket程序从linux移植到windows上

嵌入式技术

1368人已加入

描述



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



打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分