Je suis en train d'écrire un protocole de couche d'application simple en utilisant tcp et je rencontre un problème. Je veux faire la fragmentation dans l'envoi de message parce que les messages sont si longs. Mais je ne peux pas synchroniser le processus et le client lit le tampon vide avant que le serveur n'écrive les données. Les messages sont d'environ 4mb. Comment puis-je écrire ces méthodes?Unix Socket envoyer/recevoir des messages longs
Pour le client
void send_message(string message);
string receive_message()
Pour le serveur
void send_message(int sock,string message)
string receive_message(int sock)
Mes fonctions sont inférieures
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;
}
Qu'avez-vous essayé? Qu'est-ce qui vous a causé des problèmes? Avez-vous regardé appel 'select'? – Eregrith
no. comment puis-je utiliser? J'ai ajouté les codes ci-dessus. –
Après y avoir réfléchi, 'select' n'est nécessaire que lorsque vous avez plusieurs connexions à différents clients. Vous n'en avez pas besoin pour un simple modèle d'envoi/réception – Eregrith