我最近开始在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_server和TcpEchoClient.
我知道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++编写一个库,并且有一个像这样的类层次结构:
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"错误.有办法解决这个问题吗?
想象一下,你有一个很大的功能来锁定/解锁内部的互斥锁,你想要将功能分解为更小的功能:
#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) 在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) 我是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) 我在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文件,则必须手动链接到它们.
有办法解决这个问题吗?
我知道你不能通过以下方式在VS2010中添加一个名为"Socket"的类:
你得到:
'Socket' is a reserved class name
Run Code Online (Sandbox Code Playgroud)
所以相反,我尝试添加一个名为"Socket1"的类,删除所有出现的"1",VS似乎编译没有任何错误.这会引起任何冲突吗?或者正在使用命名空间以解决上述错误的正确方法?
如何在不使用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++ ×5
c ×3
visual-c++ ×2
eclipse ×1
eclipse-cdt ×1
header-files ×1
linux ×1
mutex ×1
oop ×1
openssl ×1
pthreads ×1
sockets ×1
windows ×1
winsock2 ×1