Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- #include <Windows.h>
- struct packet_s
- {
- unsigned char data_size;
- unsigned char data[256];
- };
- enum _xfer_state_
- {
- SEND_HEADER,
- SEND_DATA,
- SEND_COMPLETE,
- WAIT_FOR_ACK
- };
- enum _recv_state_
- {
- RECV_HEADER,
- RECV_DATA,
- RECV_COMPLETE,
- SEND_ACK
- };
- enum _response_
- {
- ACK = 0xE2,
- NACK = 0xF4
- };
- unsigned char _dummy[256];
- unsigned char global_comm_buffer[8];
- unsigned char comm;
- DWORD WINAPI recv_data(void)
- {
- struct packet_s packet;
- enum _recv_state_ recv_state = RECV_HEADER;
- unsigned char local_comm = 0;
- unsigned char data_recv;
- unsigned char* ptr_data;
- while (recv_state != RECV_COMPLETE) {
- switch (recv_state) {
- case RECV_HEADER:
- //insert your code here
- break;
- case RECV_DATA:
- //insert your code here
- break;
- case SEND_ACK:
- //insert your code here
- break;
- }
- }
- memcpy((void *)_dummy,(void*)packet.data,packet.data_size);
- printf("RECV Complete\r\n");
- return 0;
- }
- DWORD WINAPI xfer_data(struct packet_s* ptr_packet)
- {
- enum _xfer_state_ xfer_state = SEND_HEADER;
- unsigned char local_comm = comm;
- unsigned char data_sent;
- unsigned char* ptr_data = ptr_packet->data;
- while (xfer_state != SEND_COMPLETE) {
- switch(xfer_state) {
- case SEND_HEADER:
- data_sent = 0; //total data sent
- global_comm_buffer[0] = ptr_packet->data_size; //set byte zero of header packet to the total data size
- local_comm = comm ^= 1; //flip the comm bit to let recieving side know data is there
- xfer_state = WAIT_FOR_ACK; //wait for the acknowledgement before advancing
- break;
- case SEND_DATA:
- memcpy((void *)&global_comm_buffer[0], (void*)ptr_data, 8); //copy the appropriate amount of data into the comm buffer
- data_sent += 8; //track the amount of data sent
- ptr_data += 8; //advance the buffer pointer 8 bytes
- local_comm = comm ^= 1; //flip the comm bit to let recieving side know data is there
- xfer_state = WAIT_FOR_ACK; //wait for the acknowledgement before advancing
- break;
- case WAIT_FOR_ACK:
- if (local_comm != comm) { //wait for the acknowledgement before advancing (has the bit been changed?)
- if (global_comm_buffer[0] == ACK) { //was the response and ACK?
- printf("Recieving ACK\r\n");
- if (data_sent >= ptr_packet->data_size) { //has all the data been sent?
- xfer_state = SEND_COMPLETE; //yes - complete and break the loop return to main thread
- } else {
- xfer_state = SEND_DATA; //no -- send the next chunk
- }
- }
- else {
- printf("Error Sending\r\n");
- xfer_state = SEND_COMPLETE; //break loop and return
- }
- }
- break;
- }
- }
- printf("XFER Complete\r\n");
- return 0;
- }
- int main(void)
- {
- struct packet_s packet;
- unsigned char* ptr_data = &packet.data[0];
- unsigned int buf_len;
- HANDLE threads[2];
- comm = 0;
- //designating random buffer sizes
- srand(time(NULL));
- buf_len = (unsigned int)rand() % 256;
- packet.data_size = buf_len;
- //fill with random data
- while(buf_len--) {
- *ptr_data++ = (unsigned char)rand()%256;
- }
- buf_len = packet.data_size;
- ptr_data = &packet.data[0];
- printf("Buffer Size: %u\r\n", packet.data_size);
- while(buf_len--) {
- printf("0x%02x ", *ptr_data++);
- }
- printf("\r\n");
- //create two threads recv and xfer
- threads[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)xfer_data,&packet,0,NULL);
- threads[1] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv_data,NULL,0,NULL);
- WaitForMultipleObjects(1,threads,TRUE,INFINITE);
- printf("Threads Complete\r\n");
- //compare the recieved buffer with the sent buffer
- if(memcmp((void*)packet.data,(void *)_dummy,packet.data_size) == 0) {
- printf("Challenge Completed Correctly\r\n");
- } else {
- printf("Incorrect Transfer\r\n");
- }
- getchar();
- return 0;
- }
Add Comment
Please, Sign In to add comment