【问题标题】:networking and messages网络和消息
【发布时间】:2011-11-27 12:56:28
【问题描述】:

好的,所以我试图通过尝试将多个字符串作为一个 char 数组 [100] 传递来提高我的编程效率。我可以很好地从我的客户端传递所有这些信息,但现在我尝试使用 substr 或 strch 来删除我在服务器端使用 char 数组传递的值。

另一端的服务器看起来像这样,从客户端传递来的数据存储在 vel_rec 下的内存中:

recv(sock, vel_rec, 100, 0);

该程序设置为将一些基本数值数据发送到线程服务器以运行计算并返回结果。我很可能会使用 atoi 函数从字符串中取回整数值,然后将结果返回给客户端。这个返回的结果又会是一个字符数组。

客户:

char vel_snd[100], vel_rec[100], char buffer[100]; 
memset(buffer, 0, 99); 
memset(vel_snd, 0, 99); 
memset(vel_rec, 0, 99); 
recv(sock, buffer, 100, 0);
//are we connected? 
cout << "connection status = " << buffer << endl; 
string v0, a, time, space = "\n", stop;  stop = 'g';
while (stop != "x")
{
    cout<<":::Press 'x' then 'enter' at any time to quit:::"<< endl;
    cout<<"enter data? "<< endl;
    cin>>v0;
    stop = v0;
    cout<<"some more data? "<<endl;
    cin>>a;
    stop = a;
    cout<<"even more data? "<<endl;
    cin>>time;
    stop = time;
    v0 += space + a + space + time;
    strcpy(vel_snd, v0.c_str());        
    send(sock,vel_snd,strlen(vel_snd), 0);
    cout<<"Calculating...\n";
    recv(sock, vel_rec, 100, 0);
    cout<<"\nThe data in "<<time<<" seconds will be "<<vel_rec<<endl;
}

好的,所以这一切都很好,花花公子,我确信存在无限更好的连接空字符的解决方案,我什至不确定它们是否有效,如果你可以使用它们,只需将它们留在那里供你选择事物的服务器端。我试图用它们来破解我原来的字符串,但没有成功。我只希望服务器接收这个 char 数组并将其部分复制到字符串中。我假设这是可能的,但如果不能,我总是可以发送多个 char 数组,在我看来,如果在数据输入时没有正确标记和组织,它们会在服务器上混乱。一进一出,对我来说似乎很干净,老实说更可取。这里甚至可能不需要使用字符串,我只是认为它比使用 int 值和转换更好,因为我可以将它们作为字符串传递开始。无论哪种方式,我仍然需要实现一些方法来分解从客户端发送到服务器的值,并且 substr 不想使用 char 数组。

我对任何网络都非常不熟悉,这是我从看过的一些教程中第一次尝试。我就这个主题进行了 30 分钟的讲座,除了“它有效”之外没有其他解释。话虽如此,请在您的回复中保持建设性。希望我能学到更多的东西,因为我计划在我正在开发的网络游戏中实现类似的东西。哦,在我忘记这是使用 wsock32.lib 之前。

回顾:

[client] 
char array1[100] = string 1 + string 2 + string 3 
server<--char array1 
char array2<--- server 
print 
[server] 
char array1<---client string 1 + string 2 + string 3 
int A = string 1 
int B = string 2 
int C = string 3 
<some math...> 
<char array 2 = itoa  A B C> 
client <--- char array2

非常感谢

肖恩

【问题讨论】:

  • 我没有看到任何问题...
  • 好吧,我只是想知道如何从 char 数组中取出字符串
  • 为什么不单独传入字符串呢?是什么将它们结合起来为您带来了好处?你想解决效率问题?确保 a) 执行时间确实存在问题,并且 b) 您正在解决正确的效率瓶颈。

标签: c++ windows networking winsock


【解决方案1】:

不确定我是否理解了这个问题,但一种简单的技术是,例如,每次客户端输入某些内容时,都会终止换行。完成输入数据后,发送该消息。然后发送消息时,您会自动将数组的大小发送到服务器。以服务器端为例:

char* temp;
int i=0;
nr=read(sd,buf,sizeof(buf));
temp = strtok(buf,"\n");
//Got the first token within the string.
//I'm pretending its an int to switch case the server
switch(i){
case 1:
temp = strtok(NULL,"\n");
//Get the next token
printf("CASE 1 with: %s",temp);
break;
}

等等……

我没有测试过这段代码,只是从脑海中写出来,所以如果语法有错误,我会反对。

祝你好运

【讨论】:

    【解决方案2】:

    假设你将接收到的数据存储在std::string received,那么你可以使用这个函数进行拆分:

    std::vector<std::string> string_split(const std::string & str, char delim) 
    {
        std::vector<std::string> elems;
    
        std::stringstream strstream(str);
        std::string item;
        while(std::getline(strstream, item, delim))
            elems.push_back(item);    
    
        return elems;
    }
    

    然后调用

    std::vector<std::string> messages = string_split(received, '\n');
    

    编辑

    顺便说一句,你可以替换这段代码

    char vel_snd[100], vel_rec[100], char buffer[100]; 
    memset(buffer, 0, 99); 
    memset(vel_snd, 0, 99); 
    memset(vel_rec, 0, 99); 
    

    使用此代码

    char vel_snd[100] = {0}, vel_rec[100] = {0}, char buffer[100] = {0}; 
    

    不完全相同,但在使用 char 数组时已经足够了。

    【讨论】:

    • 你认为这对在客户端和服务器之间来回传递的字符数组有效吗?那是我现在的问题(另一端的拆卸)。也许我误解了你的例子,但看起来你正在处理字符串,这很容易取出项目,我什至不需要循环。还要感谢在初始化数组时清理代码,我认为你可以做到这一点,但坚持已经存在的内容。如果你有使用winsock的经验,也许我们可以使用不同的方法来回发送数据,我不知道?不过谢谢!
    【解决方案3】:

    好吧,我终于分解并将每个包含必要值的单独的 char 数组发送到多线程服务器,执行 atoi,执行计算,使用 itoa 将 int 计算结果存储回,并将其发送回客户端。只需要被KISS打在脸上。尝试在 vs2010 中制作一个 gui 来配合它,但这很头疼,所以切换到 Qt,所以我肯定会带着问题回来。感谢所有的答复。我试图投票,但我的声誉太低了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多