请教关于send和recv函数的问题

baidu9833 2009-07-23 10:29:51
谢谢大家帮忙解答:

问题是这样的
在我的客户端,我传输时这样写的:(使用的多线程,所以下面这个是线程内方法)
void * ClientFolder::Run(void *param)
{

char snd_buf[1024];

bzero(snd_buf,1024);

vector<string>::iterator it;

for (it = folder_names.begin(); it != folder_names.end(); it++)
{
strcpy(snd_buf,(*it).c_str());
send(SocketFd,snd_buf,strlen(snd_buf),0);
//sleep(1);
cout << snd_buf << endl;
//send(SocketFd,Ok_msg,strlen(Ok_msg),0);
bzero(snd_buf,1024);
}

send(SocketFd,Over_msg,strlen(snd_buf),0);
}


服务端相应的方法如下:

void ServerFolder::RecvFolder()
{
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);

int new_server_socket = accept(SocketFd,(struct sockaddr*)&client_addr,&length);

if ( new_server_socket < 0)
{
printf("Server Accept Failed!\n");
exit(-1);
}

folder_names.clear();

char buffer[1024];
bzero(buffer, 1024);

while((recv(new_server_socket,buffer,1024,0))>0)
{
cout << buffer<<endl;
cout <<Over_msg<<endl;
if(strcmp(buffer,Over_msg)==0)
{
cout << buffer << endl;
break;
}
/*
else if (strcmp(buffer,Ok_msg)==0)
{
cout << buffer << endl;
continue;
}
*/
folder_names.push_back(buffer);
//cout << buffer<<endl;
bzero(buffer,1024);
}
close(new_server_socket);
}

我出现的问题是这样的,我想把folder_names里面的元素按序传送给服务端,并保存到服务端的folder_names里面,现在输出结果是这样,客户端传输时候buffer的内容没有问题:
trans1
trans2
trans3
trans4
trans5
但是服务端接收到的buffer却是下面这样的
trans1trans2trans3trans4trans5
也就是说,我通过5次send的内容却被一次recv到buffer里面了。我很疑惑,socket通讯不是一次send就一次recv吗?还有,这种情况该如何解决呢? 谢谢大家的帮忙,新手拜谢~~~
...全文
74 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu9833 2009-07-23
  • 打赏
  • 举报
回复
嗯 谢谢楼上两位,我再理解理解 然后试着解决~
晨星 2009-07-23
  • 打赏
  • 举报
回复
所谓“流式”套接字,本身只是一个输入输出的字符“流”,本身并不提供格式控制,更不是基于消息的通信机制。
你需要自己制定应用层的协议。比如设置分割符。
goodname 2009-07-23
  • 打赏
  • 举报
回复
socket通讯不是一次send就一次recv吗?<---不是,不存在一一对应的关系。
只能将接收到的东西拼到缓冲区里面自己分析。可以使用类型+长度+内容的方式规定发送的消息的格式。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧