标签: winsockets

C++ Winsock P2P

脚本

有没有人在使用Winsock的C++中有任何良好的点对点(p2p)网络示例?对于特别需要使用这种技术的客户来说,这是一个要求(天知道为什么).我需要确定这是否可行.

任何帮助将不胜感激.

编辑

我想避免使用库,这样我就可以理解底层的源代码并进一步了解我的知识.

c++ p2p winsock distributed-computing winsockets

10
推荐指数
1
解决办法
2万
查看次数

寻找java.net.SocketException:没有可用的缓冲区空间

嗨我有一个非常难看的问题:java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?)它是客户端 - 服务器应用程序.客户端是Windows XP SP2 32b,带有两个网卡核心二重奏.Java 1.6.U7.应用程序有几个服务器套接字打开用于本地通信和几个客户端套接字用于rmi到jboss服务器.

几个小时/天后!我无法打开任何新的客户端套接字与服务器进行通信.服务器套接字仍然有效.

Windows netstat显示130到150的连接.〜3500连接后手动尝试我耗尽缓冲区!

我试过了:

  • 检查我们使用的每个套接字,我们也关闭它.
  • 在后台运行netstat以监视打开的连接
  • 运行病毒扫描以发现任何恶意软件
  • 将java更新为1.6 u16
  • 禁用第二个网络接口

  • 重新启动java后,我可以打开新连接.

    整个例外:

    cause:javax.naming.CommunicationException: Failed to connect to server IP:1099 [Root exception is javax.naming.ServiceUnavailableException: Failed to connect to server IP:1099 [Roo
    t exception is java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind]]
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - stack trace:
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1562)
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.lookup(NamingContext.java:634)
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - javax.naming.InitialContext.lookup(Unknown …

    java sockets networking windows-xp winsockets

    8
    推荐指数
    1
    解决办法
    4万
    查看次数

    使用winsock扫描局域网游戏服务器

    我正在试图弄清楚如何使用winsockets来将我的游戏变成局域网可玩的游戏.我已经阅读了一些winsockets文档,但我无法弄清楚客户端如何获得在LAN上创建的所有游戏.

    它是否必须尝试"连接"到LAN上的每个IP,例如尝试连接到192.168.0.1,然后是192.168.0.2等?有没有更好的办法?

    networking lan winsock winsockets

    6
    推荐指数
    1
    解决办法
    2615
    查看次数

    recv()直到收到NUL字节?

    我正在尝试一次从服务器接收单个数据包,因为数据包的运行速度太快,并且每个数据包的大小都未定义,因此调用带有读取字节数的recv()会读取第一个数据包,也许是其中的一部分第二个数据包。由于每个数据包都以NULL终止,因此我想逐字节读取直到接收到NULL字节。

        int recvLen = 0;
        char TB;
        char recvBuffer[1024];
        while (recv(Socket, &TB, 1, 0) > 0 && TB != 0 && recvLen < 1024)
        {
            recvBuffer[recvLen] = TB;
            recvLen++;
        }
    
    Run Code Online (Sandbox Code Playgroud)

    我认为这种方法根本无效。如果服务器发送了1024个字节,recv()将被调用1024次。

    在接收到NULL字符之前,是否还有其他方法可以调用recv(),或者有比我正在使用的方法更好的方法?


    编辑:我在从服务器发送的数据的前面添加了数据包大小,但是现在,如果一个错误的数据包甚至有时无缘无故,数据包就会混乱,并且无法接收到正确的数据。这是我的代码

    #define UPLOAD_LEN 2755
    int PacketSize, recvLen;
    char Size[4];
    char recvBuffer[UPLOAD_LEN+1];
    while(1)
    {
        if(recv(Socket,Size,4,0)>0)
        {
            Size[4] = '\0';
            PacketSize = atoi(Size);
            if (PacketSize > UPLOAD_LEN || PacketSize <= 0) continue;
            recvLen = recv(Socket, recvBuffer, PacketSize, 0);
        } else recvLen = -1;
        if (recvLen > 0)
        { …
    Run Code Online (Sandbox Code Playgroud)

    c sockets winsockets

    4
    推荐指数
    1
    解决办法
    9010
    查看次数

    任何陷阱将TServerSocket应用程序从D5移动到D2007?

    我做了一个简短的谷歌,发现什么,但我觉得我应该问.我真的不希望有任何东西,但宁愿现在问一个没有答案的问题,而不是问问题何时出错,并发现每个人都知道'陷阱'......!

    为了使整体支持/开发生活更轻松(并引入madExcept等),我将采用D5编写的半GUI应用程序(使用NativeDB连接到ASA6)并将其移植到D2007,最终将其转换为D2007进入控制台应用程序和/或服务.(目前的GUI只是一个荣耀的开始/停止按钮和活动日志).

    它是一个经典的TServerSocket应用程序,在指定的端口上进行监听,并在客户端连接时执行各种操作.我并不期待NativeDB方面存在任何大问题,但我想知道,就TServerSocket而言,D5和D2007之间是否有任何变化(错误修复,改进)?

    我们不使用阻塞套接字,Indy等 - 它只是来自scktcomp单元的TServerSocket,直接来自D5 Enterprise盒.除非在D2007下TServerSocket出现问题,否则我不打算大幅更改代码.:-)

    delphi delphi-2007 delphi-5 winsockets

    3
    推荐指数
    1
    解决办法
    389
    查看次数

    在winsock中接收奇怪的字符/符号

    我正在学习Winsock和我在发送和接收一个简单的字符串时遇到一个奇怪的问题.这是我的代码(纯C):

    客户:

    
    
    //...
    //Declarations and stuff
    
    //----------- SEND SOME DATA -------------------------------------------------
    
        char string1[] = "string-1";
        int bytes_sent = 0;
    
        bytes_sent = send(client_socket, string1, strlen(string1), 0);  
    
        printf("BYTES SENT: %i\n", bytes_sent);
        printf("\n-----------------------------------------------\n\n");
    
        system("pause");
    
    //...
    
    Run Code Online (Sandbox Code Playgroud)

    服务器:

    
    
    //...
    //Declarations and stuff
    
    //----------- START LISTENING FOR REQUESTS ------------------------------------
    
        SOCKET ClientSocket;
    
        #define BUFFER_SIZE 256
    
        int size;
        struct sockaddr_in client_info;
        char client_ip[16];
        char data_received[BUFFER_SIZE];    
        int bytes_received = 0; 
    
        listen(ListenSocket, SOMAXCONN);
    
        while(1){           
    
            ClientSocket = accept(ListenSocket, (struct sockaddr *)&client_info, &size);        
            strcpy(client_ip, inet_ntoa(client_info.sin_addr));     
    
            do{
    
                bytes_received = recv(ClientSocket, data_received, BUFFER_SIZE, 0); …
    Run Code Online (Sandbox Code Playgroud)

    c winsock winsockets winsock2

    3
    推荐指数
    1
    解决办法
    4672
    查看次数

    使用TCP连接从HTTP服务器获取数据,在极少数情况下存在垃圾数据

    我正在使用Winsocks 2.2编写一个使用Visual Studio 2010的C++网络游戏,并决定使用我的网络服务器存储游戏的活动服务器列表是个好主意.当服务器启动时,它将在我的Web服务器上注册,退出时取消注册; 当有人访问服务器列表时,服务器本身将尝试清理列表(这种行为我仍在设计不涉及服务器上的太多工作;但我想当游戏服务器试图添加自己时,我的php文件将使用fsockopen来检测它是否可以从外部网络实际访问服务器,如果没有,服务器将无法添加,直到它可以正确设置端口转发或以某种方式解决问题).

    好的,经过一些研究,我想出了如何使用TCP连接从服务器获取某些东西来格式化HTTP服务器的专用消息.这就是我所拥有的:

    if(FAIL == Connection::Get_Connection(&m_Connection, networkSettings.ServerListAddress, 80))
    {
        return FAIL;
    }
    
    m_Connection.SendMsg("GET /servers.php HTTP/1.1\r\nHost: cyclotron.leetnightshade.com\r\nUser-Agent: CycloTron\r\n\r\n");
    
    Run Code Online (Sandbox Code Playgroud)

    我期待回到格式正确的数据,我并没有完全得到.这是我得到的:

    2f
    Server Count:1
    129.21.138.1,40000,Depth of Hell
    0
    
    Run Code Online (Sandbox Code Playgroud)

    这是一些带有所有头信息的垃圾的另一个输出:

    HTTP/1.1 200 OK
    Date: Tue, 12 Apr 2011 23:23:11 GMT
    Server: Apache
    X-Powered-By: PHP/5.2.17
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Set-Cookie: PHPSESSID=8254688ee345202bd177d57e4ba339b2; path=/
    Set-Cookie: PHPSESSID=73eae89f61e7268f433af9bdfe299173; path=/
    Set-Cookie: PHPSESSID=8fb5d6fd9f1023bb00290b4daa3c7952; path=/
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text; charset=us-ascii
    
    e
    Server Count:1
    21
    
    129.21.138.1,40000,Depth of …
    Run Code Online (Sandbox Code Playgroud)

    c++ tcp winsockets winsock2 http-headers

    1
    推荐指数
    1
    解决办法
    1304
    查看次数

    有没有办法强制窗口在套接字调用上产生短读/写?

    这是出于调试目的.
    为了测试代码的短发送/短接收处理部分是否正常工作......
    有没有办法强制Windows生成短发送/ rcvs,即使是从/向socket读取/写入的少量字节?
    我更喜欢每个进程执行此操作,但如果每个进程都无法完成此操作,我就可以测试Firefox/Outlook代码如何处理这个问题了.:)

    我知道我可以手动添加巨大的消息来强迫这个,但我正在处理具有多层内容的巨大旧代码库,所以即使添加一个充满随机字节的简单巨大的消息也是非常重要的.:)

    c c++ sockets winapi winsockets

    0
    推荐指数
    1
    解决办法
    158
    查看次数