Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
带recv缓冲区的C指针显示;“不完全序列”;_C_Sockets_Buffer - Fatal编程技术网

带recv缓冲区的C指针显示;“不完全序列”;

带recv缓冲区的C指针显示;“不完全序列”;,c,sockets,buffer,C,Sockets,Buffer,我正在把一些数据读入recv while循环中的缓冲区 缓冲区前面有一些内容,我需要查看这些内容,然后找到剩余的字节。因此,我使用指针在缓冲区中导航,以获取所需的字符,以便将剩余字节复制到另一个缓冲区中 但是,当我查看指针位置(以及从strcpy调用中产生的内容)时,我的调试器只显示前几个字节,后面跟着一条“不完整序列”消息,缓冲区副本只包含几个字节,直到缓冲区中显示的是读取\000的字节 描述由于not NUL终止接收的字符而引起的问题。我做到了这一点,但它似乎仍在发生。缓冲区本身看起来很好,

我正在把一些数据读入recv while循环中的缓冲区

缓冲区前面有一些内容,我需要查看这些内容,然后找到剩余的字节。因此,我使用指针在缓冲区中导航,以获取所需的字符,以便将剩余字节复制到另一个缓冲区中

但是,当我查看指针位置(以及从
strcpy
调用中产生的内容)时,我的调试器只显示前几个字节,后面跟着一条“不完整序列”消息,缓冲区副本只包含几个字节,直到缓冲区中显示的是读取
\000
的字节

描述由于not NUL终止接收的字符而引起的问题。我做到了这一点,但它似乎仍在发生。缓冲区本身看起来很好,但它始终显示指针从未处于正确位置

我是C的新手。什么是获取剩余内容的正确方法,以便我可以做必要的工作来复制剩余内容

// reading in 256 bytes and leaving last one open to add null term
// at the start of the loop
// buffer contains: 
//`"[stuff to look past]377\330\377\340\000\020JFIF\000\001\..."`

while ((receivedBytes = recv(sock, buffer, BUFSIZE - 1, MSG_CONFIRM)) > 0) {
               buffer[BUFSIZE] = '\0';
// stuff to do ...
// len is calculated as the length of the start of the buffer to look past
// so move the pointer to the start of the contents I want to copy
// but p = [stuff to look past]377\330\377 <incomplete sequence \340>
// and no content past is read into the pointer
                        char * p = buffer;
                        p += len
// memcpy fails
                        memcpy(content, p, sizeof(content));
//读取256个字节,并将最后一个字节保留为打开状态以添加空项
//在循环开始时
//缓冲区包含:
//`“[要查看过去的内容]377\330\377\340\000\020JFIF\000\001\…”`
而((receivedBytes=recv(sock,buffer,BUFSIZE-1,MSG_CONFIRM))>0){
缓冲区[BUFSIZE]='\0';
//要做的事。。。
//len计算为要查看过去的缓冲区开始的长度
//因此,将指针移动到我要复制的内容的开头
//但是p=[要看过去的东西]377\330\377
//并且没有内容过去被读入指针
char*p=缓冲区;
p+=len
//memcpy失败了
memcpy(含量,p,sizeof(含量));
感谢您的帮助。

移动声明

char * p = `buffer`;
循环外(和其他建议):

有许多关于
recv()
用法的参考资料,包括:

您还提到了缓冲区前面有一些内容,我需要查看这些内容并获取剩余的字节……您是否考虑过使用,或。这两种方法都返回指向搜索的子字符串或搜索的字符的指针

例如,如果数据字符串中有一个已知的唯一字符用作分隔符,例如“>”,则可以使用strhr()将指针放在该
字符位置后面的内容上:

char *p = NULL;
const char source[] = {"this is >test string"};
char buff[20];

p = strchr(source, '>');
if(p)
{

    //     "this is >test string"
    //  p is here   ^
    p++; 
    //     "this is >test string"
    //  p is here    ^  
    strcpy(buff, p); 

为什么它被标记为C++?移动声明<代码> char *p=缓冲区;< /COD>循环外。<代码> MycPy(内容,p,sieof(内容));<代码> >从开始开始。<代码>内容<代码>必须是指针(或第一个参数类型是B.S),即“代码> siZeof(内容))。
是指针的大小。如果这是有意的,那就这样吧,但三十年后我可以用一只手数,手指就在原来的地方。@ElliotRodriguez-不客气。我不是反对票的选民之一,但当评论中的问题没有得到回答,或者当提供的示例代码不支持我时,反对票是很常见的et最低要求。对于大多数问题,如果可能,应提供a。希望这有帮助。
char *p = NULL;
const char source[] = {"this is >test string"};
char buff[20];

p = strchr(source, '>');
if(p)
{

    //     "this is >test string"
    //  p is here   ^
    p++; 
    //     "this is >test string"
    //  p is here    ^  
    strcpy(buff, p);