Ваша программа работает здесь.Обратите внимание, что я использую Linux, но, поскольку вы используете b
в своих fopen
аргументах, даже если вы используете WinX, он все равно должен быть таким же.
Мне пришлось синтезировать некоторые отсутствующиеэлементы, чтобы получить полную программу.Я передал req
из main
, поэтому функция [new] action
должна была использовать req->*
вместо req.*
, но в остальном она должна совпадать с вашим кодом:
#include <stdio.h>
typedef struct P2Key {
enum {
regista, request_key
} request_type; /* same size as an unsigned int */
unsigned int principal_id; /* client or server identifier */
int public_key; /* public key */
} P2Key;
void
action(P2Key *req)
{
FILE *pFile;
P2Key res;
P2Key send_key;
printf("request_type=%d regista=%d request_key=%d\n",
req->request_type,regista,request_key);
// ...
// if the principal is requesting to registering, store it in a file
if (req->request_type == regista) {
printf("Writing key to file...\n");
pFile = fopen("crypt.txt", "ab");
fwrite(req, sizeof(struct P2Key), 1, pFile);
printf("Written: %u %i ", req->principal_id, req->public_key);
fclose(pFile);
printf("Done\n");
}
// if pincipal is requesting key
if (req->request_type == request_key) {
pFile = fopen("crypt.txt", "rb");
printf("Key requested for: %u %i ", req->principal_id, req->public_key);
printf("Searching for Requested Key\n");
while (fread(&res, sizeof(struct P2Key), 1, pFile) == 1) {
printf("Read: %u %i\n", res.principal_id, res.public_key);
printf("Line Number: %ld\n", ftell(pFile));
// if this is the client requested, send the key
if (req->principal_id == res.principal_id) {
send_key.principal_id = req->principal_id;
send_key.public_key = req->public_key;
printf("Sending Key...\n");
// ...
}
}
fclose(pFile);
}
}
int
main(void)
{
P2Key req;
while (1) {
printf("Cmd (regista=%d request_key=%d): ",regista,request_key);
fflush(stdout);
scanf("%d",&req.request_type);
scanf("%u %d",&req.principal_id,&req.public_key);
action(&req);
}
}
Вот вывод, который я получил:
Cmd (regista=0 request_key=1): 0 5 6
request_type=0 regista=0 request_key=1
Writing key to file...
Written: 5 6 Done
Cmd (regista=0 request_key=1): 0 8 9
request_type=0 regista=0 request_key=1
Writing key to file...
Written: 8 9 Done
Cmd (regista=0 request_key=1): 1 8 9
request_type=1 regista=0 request_key=1
Key requested for: 8 9 Searching for Requested Key
Read: 1 2
Line Number: 12
Read: 5 6
Line Number: 24
Read: 8 9
Line Number: 36
Sending Key...
Cmd (regista=0 request_key=1): ^C