zoukankan      html  css  js  c++  java
  • 将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等等,没必要执着于跨平台。

  • 相关阅读:
    [C4] 前馈神经网络(Feedforward Neural Network)
    [C3] 正则化(Regularization)
    [C2] 逻辑回归(Logistic Regression)
    [C1] 线性回归(Linear Regression)
    Python基础学习
    装饰器
    完全理解Python迭代对象、迭代器、生成器
    django自己搭建的博客
    git学习,哇瑟说实话我想要的
    类继承和多态,子类重写构造函数,多重继承学习
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/6731050.html
Copyright © 2011-2022 走看看