簡體   English   中英

如何將消息轉換為 utf-8

[英]How do I convert messages to utf-8

我正在開發一個 sockets,客戶端位於 c 中,服務器位於 javascript 中,當我將數據從一個發送到另一個時,錯誤讀取 ECONNRESET。 我研究了這個主題並說這是因為它不在 uft-8 中。 我該如何解決這個問題?

編輯。 在意識到我的問題出在客戶端之后,我將在此處發布客戶端的代碼。

服務器

socket.on('data',function(data){
  var bread = socket.bytesRead;
  var bwrite = socket.bytesWritten;
  console.log('Bytes read : ' + bread);
  console.log('Bytes written : ' + bwrite);
  console.log('Data sent to server : ' + data);
  
  //echo data
  var is_kernel_buffer_full = socket.write('Data ::' + data);
  
});

客戶

#define closesocket close
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <locale.h>
#include <netdb.h>
#include <stdlib.h>

#include <stdio.h>
#include <string.h>

#define PROTOPORT       9925            

extern  int             errno;
char    localhost[] =   "localhost";    

int main(int argc, char * argv[])
{
        struct message {int code; char str[132];} msg;
        struct  hostent  *ptrh;  
        struct  protoent *ptrp;  
        struct  sockaddr_in sad; 
        int     sd;              
        int     port;            
        char    *host;           
        int     n;               
        char    buf[1000];       
        char    *text;           
#ifdef WIN32
        WSADATA wsaData;
        WSAStartup(0x0101, &wsaData);
#endif
        memset((char *)&sad,0,sizeof(sad)); 
        sad.sin_family = AF_INET;

        if (argc > 2) {                 
                port = atoi(argv[2]);   
        } else {
                port = PROTOPORT;       
        }
        if (port > 0)                   
                sad.sin_port = htons((u_short)port);
        else {                          
                fprintf(stderr,"Bad port number %s\n",argv[2]);
                exit(1);
        }

        if (argc > 1) {
                host = argv[1];
        } else {
                host = localhost;
        }

        ptrh = gethostbyname(host);
        if ( ((char *)ptrh) == NULL ) {
                fprintf(stderr,"Invalid host: %s\n", host);
                exit(1);
        }
        memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);

        if ( ((int)(ptrp = getprotobyname("tcp"))) == 0) {
                fprintf(stderr, "Cannot map \"tcp\" to protocol number");
                exit(1);
        }

        sd = socket(AF_INET, SOCK_STREAM, ptrp->p_proto);
        if (sd < 0) {
                fprintf(stderr, "Socket creation failed\n");
                exit(1);
        }

        if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {
                fprintf(stderr,"Connect failed\n");
                exit(1);
        }

        while (msg.code < 2) {
           printf ("Client: connection established with server\n");
           printf ("hello from client\n");
           printf ("Codigo = ");
           msg.code = atoi (fgets(buf, sizeof(buf), stdin));
           printf ("Mensagem = ");
           text = fgets(msg.str, sizeof(msg.str), stdin);
        
           send(sd, &msg/*buf*/, sizeof msg /*strlen(*buf)*/, 0);
           n = recv(sd, &msg /*buf*/, sizeof(msg /*buf*/), 0);
           printf ("Resposta = %s\n", msg.str);
                
        }

        closesocket(sd);

        exit(0);
}

在此處輸入圖像描述

在此處輸入圖像描述

我不知道 Javascript,所以我無法具體說明,但我有一些直覺可能/可能無法在不查看您的 C 客戶端的情況下提供幫助。

UTF-8

首先,我懷疑不對您的消息使用 UTF-8 編碼會引發此錯誤。 如果不查看您發送的數據類型,就很難提出解決此問題的方法。 這似乎是一個非常簡單的實現,我預感您的數據可能是普通的 ASCII 字符。 ASCII 字符 map 直接轉為 UTF-8。 如果您使用其他一些編碼數據,則需要查看 UTF-8 編碼/解碼的細節。 這可能是一個很好的起點。

有其他事情在進行嗎?

錯誤:錯誤:讀取 ECONNRESET

ECONNRESET 通常表示 TCP 連接的另一端意外關閉了他們的連接端,或者在有數據未完成時關閉了連接。 當客戶端似乎正常退出時,服務器正在引發此錯誤。 更有可能存在一些應用程序協議錯誤。 Go 通過您的代碼返回並進行一些橡皮鴨調試。 是否有一些行為允許客戶端在服務器准備好之前關閉其連接端? 一個潛在的原因是使用非阻塞 sockets。 如果您的客戶端使用非阻塞套接字,您可以調用 write()/send(),然后立即退出,在服務器有機會讀取之前斷開連接。

UTF-8 編碼(或缺少編碼)可能但不太可能導致此問題,而且您的客戶端更有可能正在重置連接。 很難准確地說出為什么您的客戶端在沒有看到任何代碼的情況下關閉了它的連接端。 逐步檢查您的客戶端和服務器,並在每次讀/寫/連接/接受/關閉時詢問自己兩端連接的當前 state 是什么,以及這個 function 將如何影響它。 如果這既不是 UTF-8 或 TCP 連接問題,那么問題可能是 JS 特定的。 在這種情況下, 這個線程將是一個很好的起點。 同樣,您的實現非常簡單,我懷疑是否發生了更微妙的框架問題。

網絡編程很棘手,需要耐心和深思熟慮。 在跳轉到數據編碼問題之前,復習一下您對 TCP 連接的理解,以及您對程序如何工作的理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM