标签: buffer

使用asyncore读取套接字缓冲区

我是Python的新手(虽然我已经用Java编程多年了),我正在开发一个简单的基于套接字的网络应用程序(只是为了好玩).我的想法是我的代码连接到远程TCP端点,然后侦听从服务器推送到客户端的任何数据,并对此执行一些解析.

从服务器 - >客户端推送的数据是UTF-8编码文本,每行由CRLF(\x0D\x0A)分隔.您可能已经猜到:想法是客户端连接到服务器(直到被用户取消),然后在它们进入时读取和解析这些行.

我已经设法让这个工作,但是,我不确定我这样做是否正确.因此,我的实际问题(代码要遵循):

  1. 这是用Python做正确的方法吗(即它真的很简单吗?)
  2. 任何提示/技巧/有用的资源(除了参考文档)关于缓冲器/ asyncore

目前,数据正在被读取和缓冲,如下所示:

def handle_read(self):
    self.ibuffer = b""

    while True:
        self.ibuffer += self.recv(self.buffer_size)
        if ByteUtils.ends_with_crlf(self.ibuffer):
            self.logger.debug("Got full line including CRLF")
            break
        else:
            self.logger.debug("Buffer not full yet (%s)", self.ibuffer)

    self.logger.debug("Filled up the buffer with line")
    print(str(self.ibuffer, encoding="UTF-8"))
Run Code Online (Sandbox Code Playgroud)

ByteUtils.ends_with_crlf函数只是检查缓冲区的最后两个字节\x0D\x0A.第一个问题是主要问题(答案是基于此),但任何其他想法/提示都表示赞赏.谢谢.

python sockets buffer asyncore

1
推荐指数
2
解决办法
1851
查看次数

如果缓冲区中有足够的空间,则将整数复制到缓冲区

如果缓冲区有足够的空间,我有一个函数将整数复制到缓冲区

void copy_int(int val, void *buf, int maxbytes)
{
    if (maxbytes-sizeof(val) >= 0)
        mempcy(buf, (void *) &val, sizeof(val));
}
Run Code Online (Sandbox Code Playgroud)

问题是它总是将值复制到缓冲区,即使maxbytes太小也是如此.我不知道这是为什么?

c buffer integer copy

1
推荐指数
1
解决办法
2284
查看次数

glGenBuffers返回非唯一名称

我认为这是不可能的,但我用我的软件看到它.我已经构建了一个包装器对象来管理我的缓冲区对象(我正在使用共享上下文,所以我不能使用VAO),并且VBO方面的工作正常,直到我开始用IBO测试它(glDrawElements(),我' m使用纯OpenGL 3+环境).

以下是向我的对象添加缓冲区的代码(Sy_GLOb​​ject):

QList< uint > Sy_GLObject::addBuffers( uint numBuffers, GLenum target,
                                       GLenum numericType, GLenum usage )
{
    uint* adds = new uint[numBuffers];
    glGenBuffers( numBuffers, adds );

    QList< uint > l;
    for ( uint i = 0; i < numBuffers; ++i ) {
            Buffer buffer( target, adds[i], 0, numericType, usage );
            buffers_ << buffer;

            l << i;
    }
    delete[] adds;

    Sy_GL::checkError();
    return l;
}
Run Code Online (Sandbox Code Playgroud)

并且此函数返回的缓冲区名称很好,直到此代码调用它:

void Sy_BVH::initialiseGLObject()
{
    Sy_application::getMainWindow()->getActiveProject(
                                        )->getModelContext()->makeCurrent();

    GLuint vLoc = Sy_settings::get( "shader/flat/vertexLoc" ).toUInt();
    drawBBs_ = Sy_GLObject::createObject();

    // …
Run Code Online (Sandbox Code Playgroud)

c++ opengl buffer

1
推荐指数
1
解决办法
1062
查看次数

将stdout重定向到缓冲区,而不是使用>

我编写了printf的实现 - myPrintf,它打印到stdout.我想验证它是否正常工作.为了检查打印输出的相关性,我想将它与我希望得到的char进行比较.如何编写代码以将stdout重定向到缓冲区,而不是使用>.

我只能使用printf!

c++ printf buffer stdout

1
推荐指数
1
解决办法
1047
查看次数

使用fread读入int缓冲区

我想知道我是否可以使用fread将数据读入整数缓冲区.我看到fread()将void*作为第一个参数.所以我不能只传递一个整数缓冲区(类型转换为void*)然后使用它来读取我想要的文件中的howmuchevery字节,只要缓冲区足够大?

即.我无法做到:

  int buffer[10];
  fread((void *)buffer, sizeof(int), 10, somefile);
  // print contents of buffer
  for(int i = 0; i < 10; i++)
  cout << buffer[i] << endl;
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

谢谢

c c++ buffer fread

1
推荐指数
1
解决办法
1万
查看次数

基于strlen的意外成功复制

我正在使用C++中的指针和缓冲区来检查我的技能.我尝试了下面的代码,一切正常.没有泄漏,没有崩溃,没有.

说实话,我没想到这一点.

当我打电话时,char* buf2 = new char[strlen(buf)]我没想到srlen(buf)返回合适的尺寸.我一直认为strlen 需要一个以NULL结尾的字符串才能工作.这不是这样的,为什么它正在使用这段代码?

        int main(){
             const char* mystr = "mineminemine";
             char* buf = new char[strlen(mystr)];
             memcpy(buf, mystr, strlen(mystr));

             char* buf2 = new char[strlen(buf)];
             memcpy(buf2, buf, strlen(buf));

             delete[] buf2;
             delete[] buf;
        }
Run Code Online (Sandbox Code Playgroud)

c++ string buffer memcpy

1
推荐指数
1
解决办法
144
查看次数

C++编写int缓冲区

我正在尝试将一个int数组写入fstream,但是当我调用时,我得到了一个异常fstream.write.

我可以fstream用来将int数组写入文件吗?

int main(int argc, char * argv[])
{
    fstream amostra("D:\\Amostra.txt", ios::out | ios::binary);
    const int total_elements_block = 1024;
    const int buffer_size  = total_elements_block;

    const int total_buffer = 10;

    int * buffer = new int [buffer_size];
    //for (int j=0; j<total_buffer; j++){
        for (int i =0; i<total_elements_block; i++){
            buffer[i] = i;
        }
        amostra.write((char *)(&buffer), total_elements_block*4);
    //}

    amostra.close();
    delete []buffer;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ buffer

1
推荐指数
2
解决办法
4111
查看次数

将数据存入整数时会产生错误的数字?

我有这样的char缓冲区

char *buff = "aaaa0006france";
Run Code Online (Sandbox Code Playgroud)

我想提取字节4到7并将其存储在int中.

int i;
memcpy(&i, buff+4, 4);
printf("%d ", i);
Run Code Online (Sandbox Code Playgroud)

但它会打印垃圾值.

这有什么问题?

c parsing buffer pointers memcpy

1
推荐指数
1
解决办法
1754
查看次数

C++在sprintf_s中使用sprintf_s的函数

我想将数据写入char缓冲区.因此,我有一个格式化数据功能.作为一个例子,我只是将一个int值传递给函数,如下所示:

using namespace std;
#include <iostream>

char* writeData(int iData, char* sBufferData){
    sprintf_s(sBufferData, 2048, "val:%i", iData);
    return sBufferData;
}

int _tmain(int argc, _TCHAR* argv[])
{

    char sBuffer[2048];
    char sBufferData[2048];

    sprintf_s(sBuffer, 2048, "%s, %s",
        writeData(1, sBufferData),
        writeData(2, sBufferData)
        );
    printf(sBuffer);

    cin.get();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但输出结果为:val:1,val:1

我想要的是:val:1,val:2

有人可以向我解释,为什么我在最终缓冲区中获得两次1值?

c++ buffer char

1
推荐指数
1
解决办法
566
查看次数

std :: ifstream :: read()读取少于请求并设置failbit没有明显的原因

我试图用缓冲区将整个文件读入缓冲区 std::ifstream该失败没有明显的原因,所以我构建了一个演示问题的最小代码示例:

std::vector<char> vec;
vec.resize(1000);
std::ifstream file("G:/Pictures/Webcam/Snapshot_20110209.jpg");
file.exceptions(std::ifstream::badbit | std::ifstream::failbit | std::ifstream::eofbit);
std::cout << file.good() << std::endl;
try {
    file.read(vec.data(), 100);
} catch (std::ios_base::failure f) {
    std::cout << f.what() << " Characters extracted: " << file.gcount() << std::endl;
} catch (...) {
    std::cout << "Some other error" << std::endl;
}
std::cout << "Done" << std::endl;
file.close();
Run Code Online (Sandbox Code Playgroud)

我正在尝试读取的文件大小为48kb,因此读取100个字节应该不是问题.1000字节的缓冲区很大,所以也应该没问题.现在,发生的是流只读取61个字节,然后设置failbit.生成的输出如下:

1
ios_base::failbit set: iostream stream error Characters extracted: 61
Done
Run Code Online (Sandbox Code Playgroud)

因此,出于某种原因,故障位置设置在61个字节之后.如果我读取少于61个字节,它的工作原理.如果我尝试阅读更多,它也会在61处失败.我也尝试过类似大小,同样问题的其他文件.一些完全不同的不同大小的文件显示相同的行为,但在166字节之后.

现在,如果我使用Qt的QFile类来读取数据,一切正常,我可以读取完整的文件.代码如下所示:

QFile file(path);
std::vector<char> buffer;
buffer.resize(file.size());
if (!file.open(QIODevice::ReadOnly)) return; …
Run Code Online (Sandbox Code Playgroud)

c++ buffer file istream

1
推荐指数
1
解决办法
589
查看次数

标签 统计

buffer ×10

c++ ×7

c ×3

memcpy ×2

asyncore ×1

char ×1

copy ×1

file ×1

fread ×1

integer ×1

istream ×1

opengl ×1

parsing ×1

pointers ×1

printf ×1

python ×1

sockets ×1

stdout ×1

string ×1