c++ - 基本套接字服务器

标签 c++ sockets actionscript server-side

所以我想做的是理解套接字是如何工作的,以及如何制作一个简单的服务器以在服务器和客户端应用程序之间进行通信

我尝试使用 AS3 和名为 Red Tamarin 的项目来完成此操作(在控制台上运行 AS3 代码,但目前并不重要)

我设法创建了一个基本的服务器,它的功能基本上是这样的:

  • 创建一个套接字并在其上激活这些:listen()、accept()。当它接受时,它还会将从 accept() 接收到的新套接字添加到连接数组中。
  • 根据连接数组的长度运行并在每个套接字上运行 receive() 的 for 循环(我没有在这些连接上调用 listen()/accept(),对吗?)

我的 actionscript 3 应用程序成功连接到服务器, 然后出于测试目的,我决定从客户端不停地 write() 到服务器,只是为了确保服务器确实在获取数据,这样我就可以进一步添加更多功能..

但是服务器似乎根本没有得到任何进一步的信息.. 它似乎只响应连接/断开连接,但并没有真正倾听它们之间的任何其他信息..

我知道展示我的代码会更好,但现在我想知道我是否正确地处理了这个问题,我在互联网上阅读了它,看起来我是这样,但我来这里只是为了当然..

提前致谢!

编辑: 我被要求提供我的一些代码,在这里,至少是最重要的部分

private var _connections:Array;
private var _socket:Socket;
private var _server:Client;
private var _running:Boolean;
private var _port:uint;
private var _address:String;

public function Server(address:String, port:uint)
{
    _connections = [];
    _address = address;
    _port = port;
    _running = false;
    _socket = new Socket();

}
public function start():void {
    _socket.bind(_port, _address);
    _socket.listen(128);
    _running = true;
    _server = new Client(_socket);
    _addClient(_server);
    _start();
}
private function _start():void {
    while (_running) {
        _loop();
    }
}
private function _addClient(client:Client):void {
    _connections.push(client);
}
public function _loop():void 
{
    var i:uint;
    var selected:Client;
    var newconn:Socket;
    for (i = 0; i < _connections.length; i++ ) {
        selected = _connections[i];
        if (selected.hasData()) {
            if (selected == _server) {

                //accept a new client connection
                newconn = _socket.accept();
                if (!newconn.valid){
                //Invalid.
                } 
                else {
                    //Add a new client
                    _addClient(new Client(newconn));
                }
            } else {
                //Read data from clients
                selected._socket.receive();
            }

        }

    }

}

最佳答案

只是为了回答您的 listen()/accept() 问题,您只需在服务器初始设置时调用 listen() 一次。之后,您需要为每个要建立的新客户端连接执行 accept()(因为 accept() 将返回一个处理新客户端的套接字文件描述符)。

在客户端被accept()之后,你将使用客户端的套接字文件描述符来接收()或发送()任何数据。

关于c++ - 基本套接字服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15299926/

相关文章:

c++ - 我关于这个赋值运算符错误的假设是否正确?

在 Linux 机器中使用套接字发送和接收文件时出现 C++ 问题

Python 脚本仅在缓冲区使用套接字接收数据并发送 KeyboardInterrupt 后才中断

xml - 如何在没有循环的情况下将简单的 XMLList 转换为字符串数组?

actionscript-3 - 在 Adob​​e AIR 应用程序中创建通知窗口

C++ 有没有办法使用 vector 的内容作为键和自定义值来初始化 unordered_map?

c++ - 通过引用传递 2D vector

c++ - Qt/C++ - "Including"头文件导致大量错误(垃圾邮件)

c# - 高性能套接字服务器(如 MMO)

algorithm - 从数字数组中获取最小值或最大值的最佳方法是什么?