Que faire si le socket Linux est tronqué

藏色散人
Libérer: 2023-03-16 09:26:30
original
1812 Les gens l'ont consulté

Solution au code tronqué du socket Linux : 1. Ouvrez la fenêtre de commande du terminal ; 2. Utilisez la commande iconv pour convertir le jeu de caractères du fichier Linux. La commande de conversion est telle que "iconv -f utf-8 -t gb2312 /server_test/. reports/software_.txt > ;/server_test/reports/software_asserts.txt".

Que faire si le socket Linux est tronqué

L'environnement d'exploitation de ce tutoriel : système linux5.9.8, ordinateur Dell G3.

Que dois-je faire si le socket Linux est tronqué ?

linux, Windows, problème de socket tronqué

Description du problème :

Il existe un client FTP écrit par moi-même sous Linux, et il existe un serveur FTP sous Windows utilisant le logiciel fourni avec Windows. le serveur Lors de la création d'un répertoire contenant du chinois ou d'un nom de fichier contenant du chinois, le nom chinois est tronqué

Analyse du problème :

Cela est sans doute dû à un problème d'encodage, alors comment confirmer de quel encodage il doit s'agir ? Baidu a découvert plus tard qu'Ubuntu utilise utf-8 par défaut, tandis que Windows utilise gbk par défaut, alors assurez-vous simplement que le contenu contenant des chemins chinois est converti en gbk lorsqu'il est envoyé

Solution :

Convertir entre utf8 et gbk :

Conversion du jeu de caractères de fichier Linux (utf8-gb2312)

Tout d'abord, la ligne de commande

Lorsque vous effectuez une conversion d'encodage sous LINUX, vous pouvez utiliser la commande iconv pour y parvenir. Ceci est pour les fichiers, c'est-à-dire la conversion du. fichier spécifié d’un codage à un autre code pour un autre. L'utilisation de la commande

iconv est la suivante :

iconv [选项...] [文件...]
Copier après la connexion
  • Spécification du format d'entrée/sortie :

  -f, --from-code=名称 原始文本编码
  -t, --to-code=名称 输出编码
Copier après la connexion
  • Liste de tous les jeux de caractères connus -l, --list

  • Sortie contrôle :

  -c   从输出中忽略无效的字符
  -o, --output=FILE   输出文件
  -s, --silent   关闭警告
  --verbose   打印进度信息
Copier après la connexion

Exemple :

iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt
Copier après la connexion

Veuillez télécharger la bibliothèque libiconv sur la carte intégrée pour les fichiers de bibliothèque requis suivants

Deuxièmement, application de fonction

1. Fichier d'en-tête

#include <iconv.h>
Copier après la connexion

2. const char *tocode, const char *fromcode);

Cette fonction explique quels deux encodages seront convertis. tocode est l'encodage cible et fromcode est l'encodage d'origine. Cette fonction renvoie un handle de conversion à utiliser par les deux fonctions suivantes.

(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);

Cette fonction lit les caractères de inbuf, les convertit et les affiche en outbuf, inbytesleft est utilisé Pour enregistrer le nombre de caractères qui n'ont pas été convertis, outbytesleft est utilisé pour enregistrer l'espace restant du tampon de sortie.

(3) int iconv_close(iconv_t cd);

Cette fonction est utilisée pour fermer le handle de conversion et libérer des ressources.

3. Exemple : exemple de programme de conversion implémenté en langage C

#include "stdio.h"
#include "string.h"
#include "iconv.h"
#include "stdlib.h"
 
static  int  charset_convert( const  char  *from_charset,  const  char  *to_charset,
                            char  *in_buf,  size_t  in_left,  char  *out_buf,  size_t  out_left)
{
     iconv_t icd = (iconv_t)-1;
     size_t  sRet = -1;
     char  *pIn = in_buf;
     char  *pOut = out_buf;
     size_t  outLen = out_left;
 
     if  (NULL == from_charset || NULL == to_charset || NULL == in_buf || 0 >= in_left || NULL == out_buf || 0 >= out_left)
     {
         return  -1;
     }
 
     icd = iconv_open(to_charset, from_charset);
     if  ((iconv_t)-1 == icd)
     {
         return  -1;
     }
 
     sRet = iconv(icd, &pIn, &in_left, &pOut, &out_left);
     if  (( size_t )-1 == sRet)
     {
         iconv_close(icd);
         return  -1;
     }
 
     out_buf[outLen - out_left] = 0;
     iconv_close(icd);
     return  ( int )(outLen - out_left);
}
 
static  int  charset_convert_UTF8_TO_GB2312( char  *in_buf,  size_t  in_left,  char  *out_buf,  size_t  out_left)
{
     return  charset_convert( "UTF-8" ,  "GB2312" , in_buf, in_left, out_buf, out_left);
}
 
static  int  charset_convert_GB2312_TO_UTF8( char  *in_buf,  size_t  in_left,  char  *out_buf,  size_t  out_left)
{
     return  charset_convert( "GB2312-8" ,  "UTF-8" , in_buf, in_left, out_buf, out_left);
}
 
int  main()
{
     char  *pIn =  "hello 中国人" ;
     char  *pOut = NULL;
     size_t  outLen = 0;
     size_t  inLen = 0;
     int  iRet = -1;
 
     inLen =  strlen (pIn);
     outLen = inLen * 3;
     pOut = ( char  *) malloc ( sizeof ( char ) * outLen);
     if  (NULL == pOut)
     {
         return  -1;
     }
     memset (pOut, 0,  sizeof ( char ) * outLen);
 
     iRet = charset_convert_UTF8_TO_GB2312(pIn, ( size_t )inLen, pOut, ( size_t )inLen);
     if  (-1 == iRet)
     {
         return  -1;
     }
 
     printf ( "out = %s;\touLen = %d\n" , pOut, iRet);
     free (pOut);
     pOut = NULL;
     return  0;
}
Copier après la connexion

Cette implémentation peut être multiplateforme, et je pense personnellement que c'est mieux~

ps : Le client FTP que j'ai créé auparavant était sous Windows, car la partie A l'a dit il y serait transplanté, je suis passé à Windows, puis le problème ci-dessus s'est produit. Bien que j'aie comparé les solutions chinoises apparues dans le projet, j'ai au moins accumulé de l'expérience dans la résolution du problème (pas en chinois, utilisez simplement du pinyin)

Recommandations associées : "

Tutoriel vidéo Linux

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!