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

  • 相关阅读:
    JAR 归档文件是与平台无关的文件格式
    事件的监听是由awt完成的
    AWT和Swing之间的基本区别
    Swing AWT一套新的图形界面系统
    AWT控件称为重量级控件
    java做web项目比较多
    Swing文本域的编辑
    AWT中文译为抽象窗口工具包
    swing包含了各种组件的类
    Java中的Swing及AWT又称GUI编程
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/6731050.html
Copyright © 2011-2022 走看看