将socket程序从linux移植到windows上

Posted Harley_Quinn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将socket程序从linux移植到windows上相关的知识,希望对你有一定的参考价值。

今天突然想试下纯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上的主要内容,如果未能解决你的问题,请参考以下文章

将 Qt 应用程序从 Linux 移植到 Windows

将 Linux 兼容项目从 Windows 移植到 Linux [关闭]

如何把程序从windows平台移植到linux平台

将数据序列化代码从 C++ linux/mac 移植到 C++ windows

是否可以使用 Cygwin 或 MinGW 将 Linux 守护程序移植到 Windows?

将 Windows 编译的 QT 应用程序移植到 Linux?