小编jpe*_*pen的帖子

Winsock2 - 如何在客户端使用IOCP

我最近开始在Windows上学习IOCP并阅读以下文章:

http://www.codeproject.com/Tips/95363/Another-TCP-echo-server-using-IOCP

您可以从以下位置下载文章的示例:

http://dl.dropbox.com/u/281215/documentation/iocp-1.00.html

该示例包含两个简单的应用程序 - iocp_echo_serverTcpEchoClient.

我知道IOCP通常用在客户端/服务器模型的服务器端,但我想使用IOCP创建客户端.

到目前为止,我已尝试修改上面的客户端示例,以便每当服务器向客户端发送响应时,它都会自动获取,但是它不起作用.

我按原样离开了iocp_echo_server.c.我修改后的TcpEchoClient.c版本如下:

//TcpEchoClient.c - a minimalistic echo client
// -----------------------------------------------------------------------------

// C language includes
#include <stdio.h>
#include <winsock2.h>
#include "mswsock.h"  // for AcceptEx
#include <stdlib.h> // exit
#include <string.h>

// Windows includes
#include <windows.h>

#pragma warning(disable: 4996) // sprintf

// -----------------------------------------------------------------------------

// configuration
enum
{
    BUFLEN = 1000,
    SERVICE_PORT = 4000,
    SERVER_ADDRESS = INADDR_LOOPBACK
};

enum // socket operations
{
    OP_NONE,
    OP_ACCEPT,
    OP_READ,
    OP_WRITE
};

typedef struct _SocketState // …
Run Code Online (Sandbox Code Playgroud)

c++ sockets windows winsock2 visual-c++

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

C++ - 基类和私有头

我正在用C++编写一个库,并且有一个像这样的类层次结构:

message.h文件(在./mylib/src中)

class Message
{
};
Run Code Online (Sandbox Code Playgroud)

request.h文件(在./mylib/include/mylib中)

#include "message.h"

class Request : public Message
{
};
Run Code Online (Sandbox Code Playgroud)

response.h文件(在./mylib/include/mylib中)

#include "message.h"

class Response : public Message
{
};
Run Code Online (Sandbox Code Playgroud)

我希望我的mylib/src文件夹中的所有内容都对用户隐藏,并且只想在mylib/include中分发文件.但问题是requst.h和response.h #include message.h,因此当#including request.h和response.h时,用户将收到"No such file"错误.有办法解决这个问题吗?

c++ header-files static-libraries

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

在私有函数内锁定/解锁互斥锁

想象一下,你有一个很大的功能来锁定/解锁内部的互斥锁,你想要将功能分解为更小的功能:

#include <pthread.h>

class MyClass : public Uncopyable
{
public:
    MyClass() : m_mutexBuffer(PTHREAD_MUTEX_INITIALIZER), m_vecBuffer() {}
    ~MyClass() {}

    void MyBigFunction()
    {
        pthread_mutex_lock(&m_mutexBuffer);

        if (m_vecBuffer.empty())
        {
            pthread_mutex_unlock(&m_mutexBuffer);
            return;
        }

        // DoSomethingWithBuffer1();

        unsigned char ucBcc = CalculateBcc(&m_vecBuffer[0], m_vecBuffer.size());

        // DoSomethingWithBuffer2();

        pthread_mutex_unlock(&m_mutexBuffer);
    }

private:
    void DoSomethingWithBuffer1()
    {
        // Use m_vecBuffer
    }

    void DoSomethingWithBuffer2()
    {
        // Use m_vecBuffer
    }

private:
    pthread_mutex_t m_mutexBuffer;
    std::vector<unsigned char> m_vecBuffer;
};
Run Code Online (Sandbox Code Playgroud)

我应该如何在较小的函数内部锁定/解锁互斥锁?

我应该首先解锁互斥锁,然后直接锁定它,最后在返回之前将其解锁?

void DoSomethingWithBuffer1()
{
    pthread_mutex_unlock(&m_mutexBuffer);
    pthread_mutex_lock(&m_mutexBuffer);
    // Use m_vecBuffer
    pthread_mutex_unlock(&m_mutexBuffer);
}
Run Code Online (Sandbox Code Playgroud)

c++ mutex pthreads

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

从函数返回对象的静态const引用

在Effective C++中(第18项:使界面易于正确使用且难以正确使用),我看到了类似于以下内容的代码示例:

class Month
{
public:
    static Month Jan()
    {
        return Month(1);
    }

    static Month Feb()
    {
        return Month(2);
    }

    //...

    static Month Dec()
    {
        return Month(12);
    }

private:
    explicit Month(int nMonth)
        : m_nMonth(nMonth)
    {
    }

private:
    int m_nMonth;
};

Date date(Month::Mar(), Day(30), Year(1995));
Run Code Online (Sandbox Code Playgroud)

更改函数是否有任何缺点,以便它们将静态const引用返回到Month?

class Month
{
public:
    static const Month& Jan()
    {
        static Month month(1);
        return month;
    }

    static const Month& Feb()
    {
        static Month month(2);
        return month;
    }

    //...

    static const Month& Dec()
    {
        static Month month(12); …
Run Code Online (Sandbox Code Playgroud)

c++ oop

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

C - 如何正确使用OpenSSL的BIO_write()

我是OpenSSL的新手.我理解BIO_write(BIO*b,const void*buf,int len)需要在循环中调用,但我不完全确定我是否正确使用它.我写了这样一个函数:

int32_t SendPacket(BIO * const pBio, const unsigned char * const pPacket, const int nPacketLength)
{
    int32_t nPos = 0;

    if (!pBio || !pPacket || !nPacketLength)
        return -1;

    while (nPos < nPacketLength)
    {
        int32_t nNumberOfBytesWritten = BIO_write(pBio, &pPacket[nPos], nPacketLength - nPos);
        if (nNumberOfBytesWritten <= 0)
        {
            if (!BIO_should_retry(pBio))
                return -1;
        }
        else
        {
            nPos += nNumberOfBytesWritten;
        }
    }

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

我正在考虑像这样使用它:

if (SendPacket(pBio, pPacket, nPacketLength) == nPacketLength)
{
    // Packet sent correctly.
}
else
{
    // Error …
Run Code Online (Sandbox Code Playgroud)

c openssl network-programming

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

Eclipse CDT - 共享库依赖问题

我在Eclipse中有两个C共享库项目,它们被称为"MyLibA"和"MyLibB":

TestA.h

int Test1(void);
int Test2(void);
Run Code Online (Sandbox Code Playgroud)

TestA.c

#include "TestA.h"

int Test1(void) { return 1; }
int Test2(void) { return 2; }
Run Code Online (Sandbox Code Playgroud)

TestB.h

int Test(void);
Run Code Online (Sandbox Code Playgroud)

TestB.c

#include "TestB.h"
#include "TestA.h"

int Test(void) { return Test1() + Test2(); }
Run Code Online (Sandbox Code Playgroud)

"MyLibA"和"MyLibB"分别产生"libMyLibA.so"和"libMyLibB.so".

我还有一个C可执行项目"MyExe":

#include "TestB.h"

int main(void)
{
    Test();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

MyExe的属性已设置,因此它知道在哪里可以找到"TestB.h"和"libMyLibB.so".它还链接到"MyLibB".

当我编译"MyExe"时,我收到以下错误和警告:

错误:

make: *** [MyExe] Error 1    
recipe for target `MyExe' failed
Run Code Online (Sandbox Code Playgroud)

警告:

libMyLibA.so, needed by libMyLibB.so, not found (try using -rpath or -rpath-link)
Run Code Online (Sandbox Code Playgroud)

如果我修改MyExe的属性,它们就会消失并且MyExe构建文件,以便它知道在哪里找到"libMyLibA.so"并链接到它但这并不理想.

例如,如果您使用的依赖于许多其他.so文件的.so文件,则必须手动链接到它们.

有办法解决这个问题吗?

c eclipse linux eclipse-cdt

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

VS2010 - 如何解决"XXX是保留类名"错误

我知道你不能通过以下方式在VS2010中添加一个名为"Socket"的类:

  • 右键单击项目
  • 添加 - >类
  • C++类 - >添加
  • 输入"Socket"作为类名并点击完成

你得到:

'Socket' is a reserved class name
Run Code Online (Sandbox Code Playgroud)

所以相反,我尝试添加一个名为"Socket1"的类,删除所有出现的"1",VS似乎编译没有任何错误.这会引起任何冲突吗?或者正在使用命名空间以解决上述错误的正确方法?

c++ visual-studio-2010 visual-c++

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

C - 将十进制数转换为压缩BCD

如何在不使用sprintf的情况下在C中实现这些转换?

20 => 0x20
12 => 0x12
Run Code Online (Sandbox Code Playgroud)

目前我有:

int year = 12;
int month = 10;
int day = 9;
unsigned char date[3];

date[0] = year & 0xFF;
date[1] = month & 0xFF;
date[2] = day & 0xFF;
Run Code Online (Sandbox Code Playgroud)

date将包含{0x0C,0x0A,0x09},但我希望它为{0x12,0x10,0x09}

c

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