编写反序列化函数将字节数组转换为 32 位无符号整数的最佳方法是什么?
typedef unsigned long uint32;
uint32 deserialize_uint32(unsigned char *buffer)
{
uint32 value = 0;
value |= buffer[0] << 24;
value |= buffer[1] << 16;
value |= buffer[2] << 8;
value |= buffer[3];
return value;
}
unsigned char* deserialize_uint32B(unsigned char *buffer, uint32* value)
{
*value = 0;
*value |= buffer[0] << 24;
*value |= buffer[1] << 16;
*value |= buffer[2] << 8;
*value |= buffer[3];
return buffer + 4;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!或者如果有更好的方法请告诉我..谢谢!
哪两个更好?
void SetBit(int *flag, int bit)
{
*flag |= 1 << bit;
}
Run Code Online (Sandbox Code Playgroud)
要么
int SetBit(int flag, int bit)
{
flag |= 1 << bit;
return flag;
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,我需要创建一个API.我使用套接字在服务器(我的应用程序)和客户端(使用我的API的其他应用程序)之间进行通信.
这个项目是c而不是C++
我来自linux背景,这是我的第一个使用Windows,Visual Studio 2008和dll库的项目.
我在客户端和服务器之间进行通信,但是我在两个项目上都有一些重复.我想创建一个库(可能是一个dll文件),两个项目都可以链接到,所以我不需要维护额外的代码.
我还必须创建具有我需要为我的客户提供的API的库.在我想要公开的API函数中,调用这些辅助函数是"重复代码",我不想将这些函数暴露给我的客户端,但我确实希望我的服务器能够使用这些函数.我怎样才能做到这一点?
我将尝试用一个例子来澄清.这就是我的开始.
服务器项目:
int Server_GetPacket(SOCKET sd);
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);
Run Code Online (Sandbox Code Playgroud)
客户项目:
int Client_SendCommand(int command);
int Client_GetData(int command, char *buf, int len);
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);
Run Code Online (Sandbox Code Playgroud)
这是我想要最终得到的结果:
//Server Project:
int Server_GetPacket(SOCKET sd);
// library with public and private types
// private API (not exposed to my client)
int ReceiveAll(SOCKET sd, char *buf, int len);
int VerifyLen(char *buf);
// public API (header file available …Run Code Online (Sandbox Code Playgroud) 我有这个代码,我没有得到预期的结果......什么是错的?
typedef struct {
int data1;
int data2;
}t;
void foo(int a, int b) {
Handle handle;
t arg;
arg.data1 = a;
arg.data2 = b;
handle = (HANDLE) _beginthread( myFunc, 0, (void*) &arg);
}
void myFunc(void *param) {
t *args = (t*) param;
int x = args->data1;
int y = args->data2;
printf("x=%d, y=%d\n", x, y);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用MSVS 2008.我正在用c编写应用程序,并且想知道什么是确定硬盘信息的最佳方法,例如可用空间和总容量.
谢谢
我有一个服务器和一个客户端应用程序,我的服务器侦听端口10015和一个发送命令到该端口的客户端.目前两者都在同一台机器上运行,但未来的目标是在不同的机器上运行.我现在正在使用这部分.
我接下来需要做的是让我的服务器向我的客户端发送命令.所以我想我可以在客户端的服务器上重新使用我的代码来监听端口.
但我不确定这是最好的方法.建议?
当我第一次尝试这个时,我首先运行我的客户端应用程序,并将命令发送给自己.我的服务器应用程序无法绑定到端口(我假设您只能在给定端口上侦听一个进程?)
问题1)服务器如何向客户端发送命令?我是否必须创建服务器 - >端口10015上的客户端通信和客户端--->服务器在不同的端口,如10016?
问题2)当我使用send()从客户端 - >服务器发送命令时,接收特定命令的ACK的最佳方法是什么?如果我不需要发送任何数据,是否有办法在服务器收到数据包时自动获得ACK?
我目前正在为我要发送的每个命令执行此操作:
create socket()
conenct() to socket
send() packet
then call recv() to receive any data
then shutdown() connection
and closesocket() at end
Run Code Online (Sandbox Code Playgroud)
不确定是否有更好的方法吗?当我的应用程序忙时,我希望每秒发送1-10个命令.
谢谢,我是这个网络应用程序的新手,所以任何帮助都非常感谢.
阅读一些评论后编辑:
我正在使用TCP协议.当我说ACK时,我的意思是我只是想从其他应用程序获得一些确认,即该命令已被接收并且没有错误地处理
c ×6
windows ×2
api ×1
arguments ×1
arrays ×1
hard-drive ×1
networking ×1
private ×1
public ×1
struct ×1