communication programmation socket --tcp

tcp flux de communication : orienté connexion, une transmission fiable, le flux d'octets orientée

Client (client):

  1. Créer prise
  2. les liens d'adresse (non recommandé actif)
  3. Émet une demande de connexion au serveur
  4. Émission / réception de données
  5. Ferme la douille

Server (serveur):

  1. Créer socket - pour établir un contact avec la carte dans le noyau pour créer une structure de prise
  2. Information pour la prise est l' adresse liée - dire le système d'exploitation que le traitement des données à moi - me mettre dans le tampon de réception
  3. Début de l' écoute - indique au système d'exploitation peut commencer à recevoir les demandes de connexion Justifier cri - communication client et le serveur doivent d' abord établir une connexion tcp - la possibilité de faire en sorte que les deux parties ont les données envoyées et reçues.
    Lorsque le serveur reçoit une demande de connexion d'un client, le processus d'établissement de la connexion se fait dans le noyau.
    tcp nouveau serveur de socket pour recevoir la première prise seule nouvelle demande de connexion, crée une nouvelle prise après la demande de connexion arrive, créée pour les communications ultérieures avec le client
  4. Socket programme serveur socket pour obtenir une poignée sur le nouveau fonctionnement
    programme serveur reçoit une nouvelle connexion dans le noyau, la création d' un nouveau socket
    programme serveur obtient le noyau de poignée d'opération de prise nouvellement créée
    sur le programme côté serveur de cette opération get communique avec la poignée du client
  5. Le serveur peut effectuer une communication de données avec le client par le biais de la nouvelle douille
    de réception de données / d' émission de données
    TCP au moment de la communication de données, il peut être transmis quiconque (parce que cette fois la connexion établie)
  6. Prise à proximité: libération des ressources

interface socket TCP décrit communication:

1, pour créer une prise de courant

int socket(int domain,int type,int protocol)

(Champ d'adresses AF_INET, prise type SOCK_STREAM, go type de protocole IPPROTO_TCP)

2, des informations d'adresse de liaison

int bind(int sockfd,sockaddr *addr,socklent_len);

3, commencer à écouter

int listen(int sockfd,int backlog);

arriéré: connexion TCP noyau en attendant la file d'attente nombre maximal de noeuds - détermine la durée pendant laquelle le serveur peut recevoir les mêmes demandes de connexion client

attaque réseau: attaques SYN flood: les
hôtes malveillants continuent d'envoyer un grand nombre de demandes d'établir une connexion au serveur pour établir une socket si le serveur est toujours pour chaque demande, le moment sera à court de ressources un plantage du serveur

4, le programme serveur reçoit une poignée à l'opération de prise nouvellement créé

int accept(int sockfd;struct sockaddr *addr,socklen_t len);

Cette étape est une fonction du noyau a terminé la file d' attente de connexion socket d'acquisition, ce qui libère un siège peut continuer à recevoir de nouvelles connexions
sockfd: descripteur - qui spécifie un nouveau socket serveur socket socket pour la nouvelle connexion créée par l'acquisition, est la prise d'écoute - prise file d' attente écouter est une file d' attente
addr: adresse des informations client
len: paramètres d' entrée-sortie: Indique la longueur que vous souhaitez obtenir des informations d'adresse, ainsi que d' obtenir des informations sur la longueur de l'adresse effectivement obtenir la
valeur de retour: le droit de retour opération spécifique de la poignée de prise nouvellement créé - descripteurs de fichiers - pour une communication ultérieure au client spécifié; rendement échoué -1

5, communique par l'intermédiaire du nouveau descripteur de socket obtenir

//接收数据
//成功返回实际接收字节数;失败返回-1,若连接断开则返回0
int recv(int sockfd,char *buf,int len,int flag);

//发送数据
//成功返回实际发送字节数;失败返回-1;连接断开则触发异常
int send(int sockfd,char *data,int len,int flag);

Parce que la prise de courant tcp décrit l' information de fin de communication non seulement actif, mais aussi des informations sur le terminal, de sorte recv / envoyer des programmes respectifs définis par la nécessité d'aller à l'adresse de fin.
sockfd: socket pour le serveur, il est nouvellement créé accepter le descripteur de retour

6, la douille est fermée

int close(int fd);

7, le client établit une connexion au serveur

int connect(int sockfd,struct sockaddr *srvaddr,socklen_t len);

sockfd: socket client - sinon l' adresse source liée, le système d'exploitation va se lier automatiquement, tandis que le service prend fin des informations d'adresse dans la structure de douille décrit dans
srvaddr: une information d'adresse du serveur

problèmes de programme du serveur de base tcp

blocage serveur de processus :
1, après que le serveur a terminé le traitement des premières données émetteur - récepteur client, le cycle et d' acceptation d' appel, car il n'y a plus de connexions viennent, de sorte que le flux de retour ici, en attendant l'arrivée d'une nouvelle connexion
2, le serveur reçoit le premier programme une demande de connexion client, les données sont Recv en attente pour recevoir un premier client, mais si le premier client ne transmet des données non, les flux de programme bloquant ici, même si le suivi des autres connexions ne sera pas traitée.

En fin de compte, le serveur va bloquer le processus, parce que le programme ne sait pas ce qui arrive quand il y aura de nouvelles connexions ne savent pas quand les données viennent, il ne peut fixer le déroulement du programme pour obtenir la première connexion écrite, puis recevoir des données (avec les clients communication final), mais, Connectez -vous et communiquer avec les clients sont susceptibles d'être bloqués,
donc conclure: le blocage processus d'application serveur car le code côté service n'est pas assez flexible;

Les solutions actuelles: la mise en œuvre de solutions multi-flux
programme serveur a deux fonctions principales et sont susceptibles de saboterie: Obtenir une nouvelle connexion / communication avec chaque client
si le flux principal d'exécution est seul responsable de l' obtention de nouvelles connexions, après l' acquisition d' une nouvelle connexion, créer un flux d'exécution en fonction de la communication avec le client
pour créer un client de communication d'écoulement d'exécution avec
aucune nouvelle connexion arrive, seul le blocage de flux principal d'exécution, mais les communique client avec le flux d'exécution peut encore communiquer ,
et si le le blocage de la mise en œuvre des communications clients, le flux principal d'exécution peut encore obtenir une nouvelle connexion, créez une nouvelle communication de flux d'exécution avec un autre client

Résumé: Le
serveur n'a pas pu poursuivre la communication client
raisons principales : le processus serveur est fixé, dans un processus pour effectuer une variété de fonctions, et chaque fonction de l'interface sont susceptibles d'obstruer les
solutions : l' exécution du programme multi-flux, chaque exécution le flux est seul responsable d'une fonction, un flux d'exécution blocage ne sera pas affecter le fonctionnement d'autres flux d'exécution des
technologies spécifiques : multi-processus / multi-thread

1, multi-processus-tâches :
parent seulement obtenir une nouvelle connexion, si l'acquisition de la nouvelle connexion, puis une nouvelle connexion pour créer un processus enfant à être responsable de la communication de cette nouvelle connexion au client spécifié
(1), le partage de code parent et de l' enfant, mais les données sont il Sons nouveau procédé a un descripteur de socket, mais le processus parent ne communique pas avec le client, nous devons fermer le nouveau socket
(2), le processus parent à prendre pour éviter zombie, et donc le rappel de signal ont été processus d' attente

Évitez processus enfant zombie: traitement du signal SIGCHLD personnalisé, parents et enfants ont chacun un newsock, processus parent ne pas utiliser les ressources pour arrêter rapidement vers le bas pour éviter les fuites
2, le traitement multithread :
le thread principal Procurez - vous une nouvelle connexion, si l' acquisition nouvelle connexion, créer un nouveau thread pour responsable de la communication à travers cette nouvelle connexion avec le client
(1), à la différence du multi-processus multi-thread, directement en copiant toutes les données d' un processus parent, la fonction d'entrée de fil, vous voulez passer un nouveau socket communiquer termes, la fonction doit former une nouvelle opération de passage de paramètres d'entrée fonction de filetage femelle entrant.
Adresse paramètre temps qui passe ne peut pas passer directement des variables locales - variables locales , car la boucle est terminée sera publié
①, ne pas appliquer directement à une variable locale, mais dans un espace de tas d'application directe, livrera le premier espace d'adressage à un fil

TcpSocket *newsock = new TcpSocket();

②, directement à la valeur du descripteur passé à travers la participation de la masse
(2), les ressources sont partagées entre plusieurs threads, bien sûr, que les nouveaux moyens sockets est un seul, bien que les fils de douilles à traiter , mais le fil conducteur ne peut pas fermer la prise arbitrairement New (partagé entre les threads table de descripteur de fichier)

Publié 59 articles originaux · a gagné les éloges 15 · vues 1582

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43867777/article/details/104920377
conseillé
Classement