C ++套接字表现得很奇怪[关闭]

Posted

技术标签:

【中文标题】C ++套接字表现得很奇怪[关闭]【英文标题】:C++ sockets acting weird [closed] 【发布时间】:2013-10-03 17:18:20 【问题描述】:

我正在尝试建立一个服务器,但 accept() 函数出现错误。问题是,它接受空连接(我不知道它们来自哪里)并且它还从它们那里接收空的东西。

这是我的 Server.cpp 类

#include "Server.h"
#include <thread>

Server::Server()

    usercount = 0;
    int RetVal=0;
    WSAData wsaData;
    WORD DllVersion=MAKEWORD(2,1);
    RetVal=WSAStartup(DllVersion,&wsaData);
    if( RetVal != 0 )
    
        MessageBoxA(NULL,"WinSocket startup failed","Error",MB_OK | MB_ICONERROR );
        exit(1);
    


bool Server::ServerStartUp()

sListen  = socket(AF_INET, SOCK_STREAM, NULL);
sConnect = socket(AF_INET, SOCK_STREAM, NULL);

addr.sin_addr.s_addr = inet_addr("192.168.0.100");
addr.sin_port        = htons(69);
addr.sin_family      = AF_INET;

bind(sListen, (SOCKADDR*)&addr,sizeof(addr));
listen(sListen,64);

//  CreateThread(0,0,&Server::ServerThread,0,0,0);
std::thread t1(&Server::ServerThread,this);
t1.join();

return true;


void Server::ServerThread()

int addrlen = sizeof(addr); 
for(;;Sleep(10))

    if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen )) 
    
        cout << " FUTU ";
        char* UserName = new char[256];
        ZeroMemory(UserName,256);
        recv(sConnect,UserName,256,0);

        char* Password = new char[256];
        ZeroMemory(Password,256);
        recv(sConnect,Password,256,0);


        users[ ++usercount ] = new Client(UserName,Password,sConnect);

        if( users[usercount] ->GetLogInSuccesful() )
            send(sConnect,"0x0001",6,0);
        else
            send(sConnect,"0x0002",6,0);

    



我也有一个结构几乎完全相同的工作示例,所以我不知道我在哪里或做错了什么......

工作示例:

int ReturnValue = 0;
ReturnValue = InitWinSocket();

if(ReturnValue != 0)

    MessageBoxA(NULL,"WinSocket startup failed","Error",MB_OK | MB_ICONERROR );
    exit(1);


users = new User[64];

sListen  = socket(AF_INET, SOCK_STREAM, NULL);
sConnect = socket(AF_INET, SOCK_STREAM, NULL);

addr.sin_addr.s_addr = inet_addr("192.168.0.100");
addr.sin_port        = htons(1234);
addr.sin_family      = AF_INET;

bind(sListen, (SOCKADDR*)&addr,sizeof(addr));
listen(sListen,64);


int addrlen = sizeof(addr);


for(;;)

    if(sConnect = accept(sListen , (SOCKADDR*)&addr,&addrlen))
    
        int SuccesfulLogIn = 0;
        SuccesfulLogIn = CheckLogInInformation();

        if(SuccesfulLogIn == 0)
        
            send(sConnect,"0x0002",6,0);
        
        else
        

        users[++ConnectionsCounter].UserConnection = sConnect;
        users[ConnectionsCounter].ID = ConnectionsCounter;
        users[ConnectionsCounter].IsUserInGame = false;
        cout<<"Smb Connected";
        send(sConnect,"0x0001",6,0);

        char* Id = new char[20];
        _itoa ( users[ConnectionsCounter].ID,Id,10 );

        send(sConnect,Id,sizeof(Id),0);

        UserThreadHandler[ConnectionsCounter] = CreateThread(0,0,(LPTHREAD_START_ROUTINE)UserThread,(LPVOID)ConnectionsCounter,0,0);

        
    

在第二个例子中,它只接受正确的连接,实际上在它到达 accept() 时一直等待,直到找到连接。

我想知道我做错了什么。

因评论而编辑:

发现实际上是我的绑定函数不起作用,我该如何解决这个问题?

【问题讨论】:

请正确缩进代码。 开始一个新线程并在下一行加入它到底有什么意义? 【参考方案1】:

我的猜测是,您正在尝试在不允许您运行程序的用户执行此操作的操作系统上侦听特权端口(低于 1024 的端口)。 bind()、listen()、accept() 等返回值表示成功或失败——你不应该在没有检查这些返回值的情况下调用它们。

【讨论】:

谢谢你我发现绑定功能不起作用,我也将端口更改为1234。任何线索我的绑定功能有什么问题? 正如我所说,您正在绑定到一个低编号端口。在 UNIX 上,只有 root 可以做到这一点。在 Windows 上,我确信也有类似的限制。 通过将 IP 地址编辑为 addr.sin_addr.s_addr = ADDR_ANY 来管理它。因为是你的回答让我意识到绑定不起作用,所以你得到我的 +1 ;)

以上是关于C ++套接字表现得很奇怪[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅地关闭异步服务器套接字? C#

C |套接字不接受通过 telnet 的连接 [关闭]

C中的套接字:关闭套接字的正确方法

如何将字节数据从套接字写入 C 中的无符号字符向量? [关闭]

C服务器套接字关闭但客户端套接字仍然可以发送另外两个包

c++ 服务器在客户端终止连接进程后不关闭 TCP 套接字连接