【问题标题】:Use Sockets in multiple *.cpp files在多个 *.cpp 文件中使用套接字
【发布时间】:2015-09-08 21:00:07
【问题描述】:

正如您在标题框中看到的那样,我想找到一种方法来在多个 cpp 文件中使用我的套接字。

#pragma comment(lib,"ws2_32.lib")


void main()
{
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2,0), &wsaData);

  SOCKET slisten,client;

  slisten = socket(AF_INET,SOCK_STREAM, 0);

  //and so on...

}

这是我使用ws2_32.lib 的方式,但只是主要的。 我想在其他文件中使用套接字client,所以我可以 将数据发送到任何我想要的地方。套接字被声明为全局变量。 如果有人能给我建议,我会很好。

提前致谢。

【问题讨论】:

    标签: c++ sockets server


    【解决方案1】:

    这个问题似乎不是特定于套接字,而是一般的全局变量。 如果您需要创建一个必须由多个编译单元访问的全局变量(在本例中为套接字):

    • 您在一个编译单元(即一个 cpp 文件)中定义全局变量
    • 您在需要使用它的所有其他编译单元中使用extern 语句声明该变量。

    一些进一步的信息:

    • 如果您的程序是多线程的,您需要通过std::mutex 保护全局变量免受并发使用
    • 不同编译单元中全局变量的初始化顺序具有未定义行为。这被称为static initialization order fiasco。您可以通过使用来强加特定的顺序,例如SIngleton 或某种工厂设计模式。

    【讨论】:

    • 放入 main.cpp SOCKET slisten,client; 和 Communication.* extern SOCKET slisten,client。但是,我强烈建议您在继续之前阅读一本好的 C 或 C++ 书籍。您似乎缺少有关声明/定义和编译单元的整个背景。您最终可能会遇到麻烦...您可以阅读“The C Programming Language”(Kernighan 和 Ritchie 着)或“The C++ 编程语言”第 4 版(Stroustrup 着)。
    【解决方案2】:

    使用“extern”关键字 - 它告诉链接器这已经在此范围的其他地方定义并且应该被链接。

    主文件-

    SOCKET slisten,client;
    

    其他文件:

    extern SOCKET slisten,client;
    

    https://www.youtube.com/watch?v=hDfDnsvEodQ

    【讨论】:

    • Ew,视频是解释与编程相关的任何事情的最糟糕的格式。否则很好的答案。
    • @Zharf weill 还有一个链接,如果不是,谷歌也是你的朋友 :) 如果你喜欢这个答案,为什么不点赞:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多