|
The old modem protocols XModem, YModem and Zmodem are designed for what you are doing they send packets with CRC checks and packets are accept or reject which causes the packet to be resent. You can net search for the code.
A simple XModem send routine looks like this which should give you an understanding of what it does
Send data of a fixed packet size, send the CRC for the packet .. wait for ACK or NAK. Resend packet on NAK.
simple xmodem/ymodem implementation in C · GitHub[^]
A full Zmodem with both send and receive implementation is more complex but once you understand the simple xmodem it should make sense. The greater complexity is because the transfer packet size auto adjusts, as you get more packet rejects it sends smaller and smaller packets. If you are getting transmission errors you don't want to waste time sending large packets over and over, expect an error and send small packets. The smaller packets means there is a lot of packet acknowledges going on but that is faster than resending large packets.
pkg-sbbs/zmodem.c at master · ftnapps/pkg-sbbs · GitHub[^]
ZMODEM - Wikipedia[^]
Ethernet protocols extend beyond that in that they allow and expect the packets to arrive out of order. The X/Y/Z modem protocols are strictly packets in order processes which is what you said was okay.
In vino veritas
modified 5-Aug-18 20:39pm.
|
|
|
|
|
A little while ago, I paid a visit to the official documentation page that covers the LTCG linkage editor command line switch, at /LTCG (Link-time Code Generation) | Microsoft Docs, which spears to me to give misleading information about where the option is set in Visual Studio. Being the good citizen that I am, I wrote it up, which gave rise to Setting LTCG in Visual Studio 2017 · Issue #376 · MicrosoftDocs/cpp-docs · GitHub. Upon visiting the generated issue page on GitHub, I added a picture of the property page where I found and set the option, to expedite linking of the release build of a project that imports a module that was compiled with the /GL switch, so that it can be used with P/Invoke.
This is not my first exposure to commenting on Microsoft documentation, and I am delighted to see this direct feedback channel. I wish there had been such a direct channel when I discovered a bug in the COBOL compiler for the IBM System/34, way back in 1980. I reported that bug, but it required writing and sending a full-blown business letter, via the United States Postal Service, and the attendant delays and labor on the IBM end of the connection.
I was further gratified to discover that, since I have an active GitHub account, I could augment the textual comment that caused the issue to be opened with a picture of my screen, captured courtesy of the ALT-Print Screen keyboard shortcut and the built-in Paint program. Yes, I still use Paint, more often than you might think.
Since I assume that adding such detail to the issue is available to me because I have an active GitHub account, I'd say this is ample reason for any serious developer to have one, even if you don't have any repositories, although I opened it because I have a handful of them.
David A. Gray
Delivering Solutions for the Ages, One Problem at a Time
Interpreting the Fundamental Principle of Tabular Reporting
|
|
|
|
|
Hey guys!
I have the following code and I can't seem to find a way to query my previous query because $row['name']; is not working... Here is part of my code:
<?php
$id = $_GET['id'];
if ($id) {
$sql = "SELECT * FROM forum_sub_cats WHERE id = ?;";
if(!mysqli_stmt_prepare($stmt, $sql)) {
echo "SQL error";
} else {
mysqli_stmt_bind_param($stmt, "i", $id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$resultCheck = mysqli_num_rows($result);
$admin_user_level = $admin_user_level + '1';
if ($resultCheck < 1) {
echo "The forum you are trying to create a topic on, does not exist\n";
} else {
$row1 = mysqli_fetch_assoc($result);
if ($row1['admin'] == 1 && $admin_user_level == 0) {
echo "You are not an administrator, therefore you cannot post on this forum!\n";
} else {
if (!$_POST['submit']) {
echo "<table border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n";
echo "<form method=\"POST\" action=\"./forum_main.php?act=create&id=".$id."\">\n";
echo "<tr><td>Form Sub Category</td><td><select name=\"cat\">\n";
$sql2 = "SELECT * FROM forum_cats WHERE admin < ?;";
if(!mysqli_stmt_prepare($stmt, $sql2)) {
echo "SQL error";
} else {
mysqli_stmt_bind_param($stmt, "i", $admin_user_level);
mysqli_stmt_execute($stmt);
$result2 = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result2)) {
$row = $row['id'];
$sql3 = "SELECT * FROM forum_sub_cats WHERE cid = ?;";
if(!mysqli_stmt_prepare($stmt, $sql3)) {
echo "SQL error";
} else {
mysqli_stmt_bind_param($stmt, "i", $row);
mysqli_stmt_execute($stmt);
$result3 = mysqli_stmt_get_result($stmt);
echo "<option value=\"0\">".$row['name']."</option>\n";
while ($row2 = mysqli_fetch_assoc($result3)) {
$selected = ($row2['id'] == $id) ? "SELECTED": "";
echo "<option value=\"".$row2['id']."\"".$selected."> ".$row2['name']."</option>\n";
}
|
|
|
|
|
unfortunately your code nothing to do with C/C++/MFC...
Maybe you will try to ask to some more appropriate forum?
|
|
|
|
|
Try to write a small program.almost forgot task sync concept, need some help.
task1:
if (cx == True)
{
do task1();
cx = False;
}
task2:
if (cx == False)
{
do task2();
cx = True;
}
Is possible the 2 tasks step in a deadlock situation?
Thanks
|
|
|
|
|
|
can you explain a little more ? thanks
|
|
|
|
|
|
Why the above code could be deadlock. thanks
|
|
|
|
|
Because they are both using the same variable without checking that it is free to update. Follow the link in my response and read about thread synchronisation.
|
|
|
|
|
So use While(cx != True) ; similar code could resolve it?
|
|
|
|
|
Possibly, but threads do not always behave the way you expect.
|
|
|
|
|
Sure, the code is embedded software code, no OS, so, do you think there is a better way to implement the condition variable?
|
|
|
|
|
That's a whole new question.
|
|
|
|
|
Hey Guys,
I'm writing an application in C++ that needs to write shared memory to windows and I've hit a stumbling block.
Even though I'm not getting any error messages (I've stepped through with the debugger) it would appear nothing is writing to shared memory. Here is the code that writes the shared memory,
void Write_Physics(PhysicsStruct *s_physics)
{
TCHAR szName[] = TEXT("Local\\physics");
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(PhysicsStruct), szName);
if (!hMapFile)
{
return;
}
mapFileBuffer = (unsigned char*)MapViewOfFile(m_physics.hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(PhysicsStruct));
if (!mapFileBuffer)
{
return;
}
CopyMemory(mapFileBuffer,s_physics,sizeof(PhysicsStruct));
UnmapViewOfFile(m_physics.mapFileBuffer);
CloseHandle(m_physics.hMapFile);
}
My difficulty is that when I try another process to read the shared memory nothing is happening. For completeness here is the code that reads the structure from the shared memory,
void Read_Physics(PhysicsStruct *s_physics)
{
TCHAR szName[] = TEXT("Local\\physics");
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(PhysicsStruct), szName);
if (!m_physics.hMapFile)
{
return;
}
mapFileBuffer = (unsigned char*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, sizeof(PhysicsStruct));
if (!mapFileBuffer)
{
return;
}
s_physics = (PhysicsStruct*)mapFileBuffer;
UnmapViewOfFile(mapFileBuffer);
CloseHandle(hMapFile);
}
If anyone has any suggestions it would be greatly appreciated. What the problem resembles is like trying to write something to file and forgetting the fprintf or file write commands.
Thanks in advance guys.
|
|
|
|
|
Where is hMapFile declared?
void Read_Physics(PhysicsStruct *s_physics)
{
TCHAR szName[] = TEXT("Local\\physics");
here >>>> hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(PhysicsStruct), szName);
if (!m_physics.hMapFile)
{
return;
}
mapFileBuffer = (unsigned char*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, sizeof(PhysicsStruct));
if (!mapFileBuffer)
{
return;
}
s_physics = (PhysicsStruct*)mapFileBuffer;
UnmapViewOfFile(mapFileBuffer);
CloseHandle(hMapFile);
}
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
There is another problem with the code for the Read function:
You're passing the pointer s_physics by value. This is not going to do what you want. You need to pass the pointer's address.
You would do that like so:
void Read_Physics(PhysicsStruct **s_physics)
Then inside the function:
*s_physics = (PhysicsStruct*)mapFileBuffer;
And the read function would be called thusly:
Read_Physics(&s_physics);
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Richard,
Many thanks for answering. My apologies I wrote this as pseudo code to try and save time. The declarations for those are,
HANDLE hmapFile;
unsigned char *mapFileBuffer;
They are at the beginning of each function. The joys of doing this at 1:00am!
Copy you on the declaration of the read function - leave that with me to sort out.
Apart from this is there any other reason you can see for this and particular the write function not working?
Many thanks in advance.
|
|
|
|
|
D_code_writer wrote: I wrote this as pseudo code to try and save time.
It's not helpful if you post code that is not the actual code that is causing the problem.
I can see one other BIG problem:
You're setting s_physics to point to the memory of the file map, but then you're closing the file mapping!
EDIT:
The problem is the same with the write function. You're writing to the memory, but then you're closing the file mapping! The read function cannot read from a file mapping that doesn't exist.
I think this is the main reason it's not working. You need to copy the memory pointed to by mapFileBuffer, and return that as your result. Then you'll need to free this memory somewhere else.
So, in pseudo code:
Read Function:
Create File Map;
Allocate new memory = sizeof(PhysicsStruct);
Copy memory from File Map to new memory;
Set s_physics = new memory;
return s_physics;
The difficult we do right away...
...the impossible takes slightly longer.
modified 3-Aug-18 8:48am.
|
|
|
|
|
Richard,
Copy that - I actually figured it out. I found an old VC++ 6 project called MMFAPP1. That actually worked. Here is the crux of the fix.
Declare the following variables,
HANDLE m_hFileMMF;
LPVOID m_pViewMMFFile;
Then create the file handle,
m_hFileMMF = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,4*1024,"MyMMF");
DWORD dwError = GetLastError();
if ( ! m_hFileMMF )
{
MessageBox(_T("Creation of file mapping failed"));
}
else
{
m_pViewMMFFile = MapViewOfFile(m_hFileMMF,FILE_MAP_ALL_ACCESS,0,0,0);
if(! m_pViewMMFFile )
{
MessageBox(_T("MapViewOfFile function failed"));
}
}
Once that is done to write the data to the shared memory we have
PhysicsStruct s_physics;
if(m_pViewMMFFile )
CopyMemory(m_pViewMMFFile,&s_physics,sizeof(PhysicsStruct));
To read from the shared memory we have,
if(m_pViewMMFFile )
CopyMemory((PVOID)&s_physics,m_pViewMMFFile,sizeof(SPageFilePhysics));
I tested that and it worked like a charm. Also many thanks to the guy who wrote MMFAPP1 in the first place. It saved my neck. Also Richard thanks for your help as well.
|
|
|
|
|
Glad you got it sorted.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
So am I!! Thanks again for your help
|
|
|
|
|
Hi I need to create edit control on frame window.
please suggest to do so?
|
|
|
|
|
|
I already answered that in reply to CEditCtrl in FrameWnd:
Frame windows do not contain user controls. Those should be part of views which in turn are hosted by frame windows.
|
|
|
|
|