如何在C ++聊天应用程序中添加昵称?

时间:2013-11-17 09:47:51

标签: c++ chat

所以我制作了这个C ++聊天应用程序,它不起作用。 所以基本上我只想输入一个昵称,然后连接到主人。帮助将不胜感激。谢谢!

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

#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <string>

using namespace std;


SOCKADDR_IN addr;

SOCKET sConnect;

// For this we need to send two information at one time:
// 1. The main message
// 2. The ID

// To send more than one information I will use a struct
struct Buffer
{
    string ID;
    char Message[256];
};

int ClientThread()
{
    Buffer sbuffer;

    char buffer[sizeof(sbuffer)] = {0};

    for(;; Sleep(10))
    {
        // The server will send a struct to the client
        // containing message and ID
        // But send only accepts a char as buffer parameter
        // so here we need to recv a char buffer and then
        // we copy the content of this buffer to our struct
        if(recv(sConnect, buffer, sizeof(sbuffer), NULL))
        {
            memcpy(&sbuffer, buffer, sizeof(sbuffer));
            cout << "<Client " << sbuffer.ID << ":> " << sbuffer.Message     <<endl;
        }
    }

    return 0;
}    

int main()
{
system("cls");

int RetVal = 0;

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

sConnect = socket(AF_INET, SOCK_STREAM, NULL);

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

cout << "Connect to Masterserver? [ENTER]" <<endl;
getchar();
RetVal = connect(sConnect, (SOCKADDR*)&addr, sizeof(addr));

if(RetVal != 0)
{
    MessageBoxA(NULL, "Could not connect to server", "Error", MB_OK | MB_ICONERROR);
    main();
}
else
{
    string ID;
            cout << "What is your name?" << endl;
            cin >> ID;

    cout << "Connected" <<endl;

    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE) ClientThread, NULL, NULL, NULL);

    for(;; Sleep(10))
    {
        char* buffer = new char[256];
        ZeroMemory(buffer, 256);

        cin >> buffer;
        getchar();

        send(sConnect, buffer, 256, NULL);
    }
}

return 0;
}

1 个答案:

答案 0 :(得分:1)

至于你的问题,你实际上并没有将id发送到服务器,因此服务器永远不会知道它。

您还有其他一些问题:在客户端输入 - 发送循环中,您将新的C ++流输入与旧的C FILE输入混合。这将导致问题,因为这两个系统完全不同并且是分开的。另外,我建议您使用std::string作为输入,也可以使用std::getline

该循环中的另一个问题是,无论您从用户那里获得多少输入,总是发送256个字节。

第三个也是非常严重的问题是你在每个循环中泄漏了256个字节。 C ++不是垃圾收集的,你分配的东西必须是免费的。这是使用std::string的另一个原因。

最后,你不会在阅读或发送时检查错误,这意味着如果用户按下EOF键序列(Windows上的 CTRL-Z CTRL-D 在Linux / OSX上)你永远不会知道它。您也不会检查发送或接收错误,也不检查已关闭的连接。