【发布时间】:2015-06-28 14:05:07
【问题描述】:
我正在使用 tcp 编写一个简单的应用层协议,但遇到了问题。我想在消息发送中进行碎片化,因为消息太长了。但我无法同步进程,客户端在服务器写入数据之前读取空缓冲区。这些消息大约为 4mb。如何编写这些方法?
给客户
void send_message(string message);
string receive_message()
服务器端
void send_message(int sock,string message)
string receive_message(int sock)
我的功能如下
void send_fragment(char* buffer,int length){
int n = write(sockfd, buffer, length);
if (n < 0)
{
perror("ERROR writing to socket");
exit(1);
}
}
string receive_fragment(){
char buffer[FRAGMENT_LENGTH];
bzero(buffer,FRAGMENT_LENGTH);
int n = read(sockfd, buffer, FRAGMENT_LENGTH-1);
if (n < 0)
{
perror("ERROR reading from socket");
exit(1);
}
return string(buffer);
}
void send_message(string message){
char buffer[FRAGMENT_LENGTH];
bzero(buffer,FRAGMENT_LENGTH);
int message_length = message.length();
//computes the number of fragment
int number_of_fragment = ceil((double)message_length / FRAGMENT_LENGTH);
sprintf(buffer,"%d",number_of_fragment);
//sends the number of fragment
send_fragment(buffer,strlen(buffer));
for(int i=0;i<number_of_fragment;++i){
bzero(buffer,FRAGMENT_LENGTH);
//fragment interval
int start = i*FRAGMENT_LENGTH;
int end = (i+1)*FRAGMENT_LENGTH;
if(i==number_of_fragment-1){
end = min(end,message_length);
}
//creates a fragment
const char* fragment = message.substr(start,end).c_str();
sprintf(buffer,"%s",fragment);
//sends the fragment
send_fragment(buffer,strlen(buffer));
}
}
string receive_message(){
//receive and computes the number of fragment
string number_of_fragment_string = receive_fragment();
int number_of_fragment = atoi(number_of_fragment_string.c_str());
string message ="";
for(int i=0;i<number_of_fragment;++i){
//concatenating fragments
message += receive_fragment();
}
return message;
}
【问题讨论】:
-
你试过什么?是什么给你带来了麻烦?你看过
select电话吗? -
没有。我该如何使用?我添加了上面的代码。
-
想了想,
select只有当你有多个不同客户端的连接时才需要。简单的发送/接收模式不需要它
标签: c sockets unix tcp unix-socket