网络和消息

时间:2011-11-27 12:56:29

标签: c++ windows networking winsock

好吧所以我试图通过尝试将多个字符串作为一个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

非常感谢

肖恩

3 个答案:

答案 0 :(得分:1)

假设您将收到的数据存储在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数组时已经足够了。

答案 1 :(得分: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 :(得分:0)

好吧我终于崩溃并发送了单独的char数组,每个数组都包含必要的值到多线程服务器,atoi,做了计算,使用itoa存储了int计算结果,并将其发送回客户端。只需要与KISS一起砸到脸上。试图在vs2010中使用gui,但这很令人头痛,所以切换到Qt,所以我会回答问题,我相信。感谢所有的答复。我试图投票,但我的声誉太低了。