• 将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等等,没必要执着于跨平台。

  • 相关阅读:
    奶酪工厂
    P1080 国王游戏(非高精版)
    【洛谷P2150】[NOI2015] 寿司晚宴
    【洛谷P3349】[ZJOI2016]小星星
    【洛谷P5785】[SDOI2012]任务安排
    【模板】严格次短路
    【洛谷P3647】[APIO2014]连珠线
    2021.10.27NOIP模拟总结
    【树形DP】CF1016F Road Projects
    2021CSP-S 总结
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/6731050.html
Copyright © 2020-2023  润新知