2011-11-27 49 views
0

好吧,所以我试图通过将多个字符串作为一个字符数组[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数组并将其复制到字符串中。我认为这是可能的,但如果不是,我总是可以发送多个字符数组,但在我看来,如果数据进来时没有正确标记和组织,他们会在服务器上混乱。 ,对我来说似乎很干净,诚实坦率地说。在这里甚至可能不需要使用字符串,我只是认为它会比使用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 

多谢

肖恩

+0

我没有在那里看到一个问题... –

+0

以及我只是想知道如何从char数组中取出字符串 –

+1

为什么你不单独传递字符串?结合他们获得你的是什么?你正试图解决效率问题?确保a)执行时间确实存在问题,并且b)您正在解决正确的效率瓶颈。 – Amy

回答

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; 
} 

等等

我没有测试过这些代码,只是写它从我的脑海里,所以如果有语法错误我oppologize。

好运

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] = {0}, vel_rec[100] = {0}, char buffer[100] = {0}; 

并不完全相同替换此代码

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

,但不够好。

+0

你认为这将在客户端和服务器之间来回传递的char数组上工作吗?这是我现在的问题(反汇编在另一端)。也许我误解了你的例子,但看起来你正在处理字符串,这将很容易获得项目,我甚至不需要循环。也感谢代码清理初始化数组,我想你可以做到这一点,但坚持已有的东西。如果你有使用winsock的经验,也许我们可以用不同的方法来回发送数据,我不知道?谢谢你! –

0

嗯,我终于崩溃了,并派出独立的字符数组每个包含必要的值到多线程服务器,做的atoi,做了计算,存储整型计算结果回用itoa,并送交回顾客户。只需要用KISS拍打脸。试图让vsi在vs2010中使用它,但这是一个头痛的问题,因此转而使用Qt,所以我会回来提问,我相信。感谢所有的答复。我试图投票,但我的名誉太低。