Implémentation du serveur client

Après quelques recherches, j’ai trouvé ce code pour le côté serveur.

#include  #include  #include  #include  #include  #include  #include  #include  #include  int main(void) { int listenfd = 0,connfd = 0; struct sockaddr_in serv_addr; char sendBuff[1025]; int numrv; listenfd = socket(AF_INET, SOCK_STREAM, 0); printf("socket resortingeve success\n"); memset(&serv_addr, '0', sizeof(serv_addr)); memset(sendBuff, '0', sizeof(sendBuff)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(5000); bind(listenfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr)); if(listen(listenfd, 10) == -1){ printf("Failed to listen\n"); return -1; } while(1) { connfd = accept(listenfd, (struct sockaddr*)NULL ,NULL); // accept awaiting request strcpy(sendBuff, "Message from server"); write(connfd, sendBuff, strlen(sendBuff)); close(connfd); sleep(1); } return 0; } 

La chose est du serveur, je veux envoyer un fichier au client, probablement en morceaux de 256 octets, par exemple.

Ce qui me trouble, c’est que dans le code ci-dessus, vous pouvez voir accept appel est fait à l’intérieur de la boucle. Est-ce la seule façon de le faire? Si cela doit être dans la boucle, où dois-je placer la logique de lecture consécutive de mon fichier et d’envoi de morceaux? Il semble que je devrais intégrer une autre boucle dans la boucle while – juste après l’appel d’ accept ?

Il semble que je devrais intégrer une autre boucle dans la boucle while – juste après l’appel d’acceptation?

Oui, vous devrez continuer à appeler write () jusqu’à ce que tous les octets aient été envoyés. Gardez à l’esprit que write () peut écrire moins d’octets que vous ne l’aviez demandé, vous devrez donc garder une trace de la valeur de retour de write () pour connaître les arguments à transmettre à l’appel suivant write ().

L’exemple de code ignore la valeur de retour de l’appel write (), ce que vous pouvez en quelque sorte vous échapper lorsque vous écrivez seulement un petit nombre d’octets, mais que vous ne voudriez pas faire dans un code réel.