gpt4 book ai didi

c - C中通过socket接收和发送数据

转载 作者:行者123 更新时间:2023-11-30 15:33:39 27 4
gpt4 key购买 nike

我想接收一个字符串,进行反向操作并通过套接字重新发送它。该字符串使用 ASN.1 编码。

recv( to_server_socket, &buffer2, sizeof( buffer2 ), MSG_WAITALL );
ber_decode(0, &asn_DEF_Message02, (void**) &message2, buffer2, sizeof buffer2);
xer_fprint(stdout, &asn_DEF_Message02, message2);
printf( "Server --> %d\n", message2->number );
char* serverString = message2->string.buf;
int byte_count = message2->string.size;
char reverseString[50];
int i=0;
for(i=0; i < byte_count; ++i)
{
char c = serverString[i];
if(c=='\0')
{
reverseString[i] = '\0';
break;
}
else if(c>=65 && c<=90)
reverseString[i] = c+32;
else if(c>=97 && c<=122)
reverseString[i] = c-32;
else
reverseString[i] = c;
}
printf("String to send: %s\n", reverseString);

我正确地收到了数字和字符串,但是当我进行转换时,我得到了一些额外的字符,如这个输出

<Message02>
<number>35</number>
<string>Dh3i5KhQNM5OgNh6O</string>
</Message02>
Server --> 35
String to send: dH3I5kHqnm5oGnH6oڹQ
msg3_buf:
30 16 13 14 64 48 33 49 35 6b 48 71 6e 6d 35 6f 47 6e 48 36 6f ffffffda ffffffb9 51 00 00 <Message03>
<string>dH3I5kHqnm5oGnH6oڹQ</string>
</Message03>

最佳答案

好的,将您在不同问题中拥有的所有信息放在一起(例如 receive and reverse a string asn.1 )我已经重现了您的问题。

首先是问题的解决方案:您不是以 null 终止反向字符串。这就是为什么当您尝试打印时后面会出现垃圾。解决方案很简单,在for循环后面添加

reverseString[i]='\0';

...我不是 100% 确定接收到的字符串是以 null 结尾的(可能,他们可能很好并且为您做这件事)...但即使是这样,大小字段也不包括字符串结尾 '\0'

现在,介绍一些背景知识。您的定义(根据上面引用的问题)是:

Message02 ::= SEQUENCE {
number INTEGER, -- incremented integer
string PrintableString (SIZE (10..20)) -- random string
}

在 ASN.1 字符串中,不需要字符串的空终止约定,因为值的长度始终在 Tag-Length-Value 结构中明确定义。事实上,您使用的在线编译器将 PrintableString 处理为 OCTET STRING,这可以给您一个提示,即所有内容都被视为原始缓冲区。

因此,例如,如果您发送 number=100 和 string="Hello World",您将获得 DER 编码:

30 10 // 0x30 = SEQUENCE, 0x10 = Length 16
02 01 64 // 0x02 = INTEGER, 0x01 = Lenght 1, 0x64= Value 100
13 0b 48 65 6c 6c 6f 20 57 6f 72 6c 64 // 0x13 = PrintableString 0x0b= Length 11, value= "Hello World"

我没有使用这个编译器来做任何严肃的事情(我只是用来尝试重现问题),我不能说 OCTETSTRINGS 或 PrintableStrings 的推荐最佳实践是什么,但要警惕 char 缓冲区。 ...

最后,我的完整程序(我不是通过套接字发送它,而是编码到缓冲区并从同一缓冲区解码)

#include "Message02.h"
#include <string.h>


#define BUFFERSIZE 100

int main() {
Message02_t *message1;
char buffer2[BUFFERSIZE];
int ival=100;
char *sval="Hello World";

message1 = calloc(1, sizeof(Message02_t));
message1->number = 100;
message1->string.buf = sval;
message1->string.size = strlen(sval);
der_encode_to_buffer(&asn_DEF_Message02, message1, buffer2, BUFFERSIZE);

//receive Message02
Message02_t *message2 = 0;
message2 = calloc(1, sizeof(Message02_t));
//recv( to_server_socket, &buffer2, sizeof( buffer2 ), MSG_WAITALL );
ber_decode(0, &asn_DEF_Message02, (void**) &message2, buffer2, sizeof buffer2);
xer_fprint(stdout, &asn_DEF_Message02, message2);
printf( "received number %d\n", message2->number );
printf( "received String %s\n", message2->string.buf );
printf( "received String size %d\n", message2->string.size );

int j;
for(j=0;j<BUFFERSIZE;j++) {
printf("%02x",buffer2[j]);
}
printf("\n");

char* serverString = message2->string.buf;
int byte_count = message2->string.size;
char reverseString[50];
int i=0;
for(i=0; i < byte_count; ++i)
{
char c = serverString[i];
if(c=='\0')
{
reverseString[i] = '\0';
break;
}
else if(c>=65 && c<=90)
reverseString[i] = c+32;
else if(c>=97 && c<=122)
reverseString[i] = c-32;
else
reverseString[i] = c;
}
reverseString[i]='\0'; /* <=== THIS IS THE FIX */
printf("String to send: %s\n", reverseString);

}

关于c - C中通过socket接收和发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23607597/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com