Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从删除字符串\n和\0创建协议行_C_String_Tcp_Char_C Strings - Fatal编程技术网

C 从删除字符串\n和\0创建协议行

C 从删除字符串\n和\0创建协议行,c,string,tcp,char,c-strings,C,String,Tcp,Char,C Strings,我们必须用C创建一个文本消息p2p应用程序。我们已经使用TCP接口完成了p2p连接,但是我们在实现发送和读取消息的协议方面遇到了困难 邮件必须采用以下格式: Line是我们要发送和阅读的消息。 消息将以3个字符开始,以指示线的大小(例如005) 然后它会有我们想要写或读的行(例如,hello) 因此,消息必须是chart[],对于本例,它将是005hello。 不能发送或读取'\n'或'\0',只能发送大小和字符串 我们使用read()和write()调用系统使用键盘读写消息,因此我们知道我们将

我们必须用C创建一个文本消息p2p应用程序。我们已经使用TCP接口完成了p2p连接,但是我们在实现发送和读取消息的协议方面遇到了困难

邮件必须采用以下格式:

Line是我们要发送和阅读的消息。 消息将以3个字符开始,以指示线的大小(例如005)

然后它会有我们想要写或读的行(例如,hello)

因此,消息必须是chart[],对于本例,它将是005hello。 不能发送或读取'\n'或'\0',只能发送大小和字符串

我们使用read()和write()调用系统使用键盘读写消息,因此我们知道我们将要删除“\n”和“\0”

我们已经尝试实现了两个功能,但它们不能像intendead那样工作。MI_SendLine(int Socket,常量字符*行)和MI_ReceiveLine(int Socket,常量字符*行)

MI_SendLine必须将*行转换为描述的协议,因此行“hello”将转换为“005hello”,“hello\0\n”将转换为“005hello”,“您时间的thx\n”将转换为“017thx您时间”

对于receiveLine函数,我们有相同的问题,因此代码将被省略

int MI_SendLine(int Socket, const char *Line)
{
    //PROTOCOL TRANSFORMATION
    //3 chars reserved for size of msg
    char message[3 + strlen(Line)];

    int size = strlen(Line);
    int j;
    for(j = 2; j >= 0; j--){
        message[j] = (size % 10) + '0';
        if(size > 0)
            size /= 10;
    }

    int i;
    for(i = 3; i < strlen(Line) + 3; i++){
      message[i] = Linia[i - 3];
    }

    //END PROTOCOL TRANSFORMATION
    return TCP_Send(Socket, message, sizeof(message));
}
我们希望“hello\n”的输出是“005hello”,但实际输出是一个充满未知字符的字符表

例如: 第一条消息:输入“aaa”收到消息“aaa?”但它不是?它本身是一个奇怪的字符,包含它

2n消息:输入“b”收到消息“b”


第三条消息:输入“ccccc”收到的消息“ccccc”,但没有?

您的代码看起来很好。垃圾一定是由于接收器中的错误造成的。您忘记附加NUL,或者一个错误导致某种关闭

至于删除换行符,如果最后一个换行符是换行符,只需减小大小并少复制一个字符

int MI_SendLine(int Socket, const char *Line)
{
    size_t len = strlen(Line);    
    if (len > 0 && Line[len-1] == '\n')
        --len;

    if (len > 999) {
        fprintf(stderr, "Message too big!\n");
        exit(1);
    }

    char message[3+len];
    message[0] = '0' + len / 100 % 10;
    message[1] = '0' + len / 10 % 10;
    message[2] = '0' + len % 10;
    memcpy(message+3, Line, len);
    return TCP_Send(Socket, message, 3+len);
}


注意,这并不检查字符串中间是否有任何提要。

如果你指的是如何从一个没有新行字符和零结束字符的字符串中获取字符,那么这里是一个演示程序,演示如何使用标准的C函数<代码> STRCSPN < /代码>。
#include <stdio.h>
#include <string.h>

int main(void) 
{
    const char *s = "thx for your time\n";
    const size_t Size = 3;
    const size_t Base = 10;

    size_t n = strcspn( s, "\n\0" );

    char result[ Size + n ];

    memcpy( result + Size, s, n );

    for ( size_t i = Size; i != 0; i-- )
    {
        result[i-1] = n % Base + '0';
        n /= Base;
    }


    printf( "\"%*.*s\"\n", ( int )sizeof( result ), 
                           ( int )sizeof( result ), 
                           result );

    return 0;
}

输出是什么?第一条消息:输入“aaa”收到消息“aaa?”,但它不是a?本身,它是一个奇怪的字符,包含它。第二条消息:输入“b”收到消息“b?。第三条消息:输入“ccccc”收到的消息“ccccc”,但不带?
    // sprintf needs space for a NUL even if we don't send it.
    char message[3+len+1];
    sprintf(message, "%03d%s", len, Line);
    return TCP_Send(Socket, message, 3+len);
    char prefix[4];
    sprintf(prefix, "%03d", prefix);
    return TCP_Send(Socket, prefix, 3) + TCP_Send(Socket, Line, len);
#include <stdio.h>
#include <string.h>

int main(void) 
{
    const char *s = "thx for your time\n";
    const size_t Size = 3;
    const size_t Base = 10;

    size_t n = strcspn( s, "\n\0" );

    char result[ Size + n ];

    memcpy( result + Size, s, n );

    for ( size_t i = Size; i != 0; i-- )
    {
        result[i-1] = n % Base + '0';
        n /= Base;
    }


    printf( "\"%*.*s\"\n", ( int )sizeof( result ), 
                           ( int )sizeof( result ), 
                           result );

    return 0;
}
"017thx for your time"