MuffinFlavored
March 7th, 2008, 01:39 AM
I have created a Winsock2 server and client to transfer information.
I want the server to find every file in directory, open it, read the username string, and see if the username sent from the client via a packet is the same as the string from the file.
I get this error:
Unhandled exception at 0x7c901010 in Server.exe: 0xC0000005: Access violation reading location 0x00000fb4.
This error lead me to string.h a few times, then it lead me to osinfo.h.
Here is the function I am having problems with (everything before this is perfect for me), with the error causing line marked.
int check_receive_register_user_data() {
WIN32_FIND_DATA f;
HANDLE h = FindFirstFile("users//*.txt", &f);
if(h != INVALID_HANDLE_VALUE) {
do {
DWORD dwNumRead;
char* filename = (char*)malloc(strlen(f.cFileName) + strlen("users//"));
sprintf(filename, "users//%s", f.cFileName);
h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
int filesize = GetFileSize(h, NULL);
char* buffer = (char*)malloc(filesize);
ReadFile(h, buffer, filesize, &dwNumRead, NULL);
buffer[filesize] = '\0';
char* username = (char*)malloc(strlen(user.username)+1);
sprintf(username, "%s\n", user.username);
char* email = (char*)malloc(strlen(user.email)+1);
sprintf(email, "%s\n", user.email);
if (strstr(buffer, username) != NULL) {
error("The username is already in use!");
send_string_size("in use username");
send_string("in use username", strlen("in use username"));
return -1;
}
if (strstr(buffer, email) != NULL) {
error("The e-mail address is already in use!");
send_string_size("in use email");
send_string("in use email", strlen("in use email"));
return -1;
}
} while(FindNextFile(h, &f) != 0); <<<< THIS TRIGGERS THE ERROR I AM POSTING ABOUT, EVERYTHING BEFORE THIS IS 100% CORRECT IN TERMS OF VALUE
}
success("The username is free!");
send_string_size("free username");
send_string("free username", strlen("free username")); //Let the server know the username is free.
success("The e-mail address is free!");
send_string_size("free email");
send_string("free email", strlen("free email")); //Let the server know the username is free.
FindClose(h);
return 1;
}
Here is my whole code.
#include "Server.h"
void error(char* string) {
printf("Error! %s\n", string);
}
void success(char* string) {
printf("Success! %s\n", string);
}
int send_string_size(char* string) {
int send_buffer_size = strlen(string);
send_buffer_size_string = (char*)malloc(sizeof(send_buffer_size));
sprintf(send_buffer_size_string, "%d", send_buffer_size);
if (send(client, send_buffer_size_string, sizeof(send_buffer_size_string), 0) == -1) {
error("Unable to send packet size!");
free(send_buffer_size_string);
return -1;
}
return send_buffer_size;
}
int send_string(char* string, int send_buffer_size) {
send_buffer = (char*)malloc(send_buffer_size);
sprintf(send_buffer, "%s", string);
if (send(client, send_buffer, send_buffer_size, 0) == -1) {
error("Unable to send packet!");
free(send_buffer);
return -1;
}
return 1;
}
int receive_string_size() {
char* receive_buffer_size_string = (char*)malloc(4);
int receive_buffer_size;
if (recv(client, receive_buffer_size_string, sizeof(receive_buffer_size_string), 0) == -1) {
error("Unable to recieve packet size!");
return -1;
}
else {
receive_buffer_size = atoi(receive_buffer_size_string);
}
return receive_buffer_size;
}
char* receive_string(int receive_buffer_size) {
receive_buffer = (char*)malloc(receive_buffer_size+1);
if (recv(client, receive_buffer, receive_buffer_size, 0) == -1) {
error("Unable to recieve packet!");
return "error";
}
else {
receive_buffer[receive_buffer_size] = '\0';
}
return receive_buffer;
}
int startup() {
WSADATA WSAData;
if (WSAStartup(0x0202, &WSAData) != 0) {
error("WSAStartup failed!");
return -1;
}
else {
success("WSAStartup succeeded!");
}
SOCKET server = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(80);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (bind(server, (LPSOCKADDR)&serveraddr, sizeof(serveraddr)) != 0) {
error("Could not bind!");
return -1;
}
else {
success("Binded!");
}
if (listen(server, 12) != 0) {
error("Could not listen!");
return -1;
}
else {
success("Listening!");
}
if ((client = accept(server, NULL, NULL)) == INVALID_SOCKET) {
error("Could not accept!");
return -1;
}
else {
success("Accepted a user!\n");
}
return 1;
}
bool get_user_status() {
int login_status_string_size = receive_string_size();
char* user_status = (char*)malloc(login_status_string_size);
sprintf(user_status, "%s", receive_string(login_status_string_size));
if (strcmp(user_status, "not logged in") == 0) {
success("The user is not logged in!");
return false;
}
else if (strcmp(user_status, "logged in") == 0) {
error("The user is logged in!");
return true;
}
}
char* receive_function() {
return receive_string(receive_string_size());
}
int receive_register_user_data() {
int username_length = receive_string_size();
user.username = (char*)malloc(username_length);
sprintf(user.username, "%s", receive_string(username_length));
if (strcmp(user.username, "error") == 0) {
error("user.username is error!");
return -1;
}
else {
success("Received username!");
}
int password_length = receive_string_size();
user.password = (char*)malloc(password_length);
sprintf(user.password, "%s", receive_string(password_length));
if (strcmp(user.password, "error") == 0) {
error("user.password is error!");
return -1;
}
else {
success("Received password!");
}
int email_length = receive_string_size();
user.email = (char*)malloc(email_length);
sprintf(user.email, "%s", receive_string(email_length));
if (strcmp(user.email, "error") == 0) {
error("user.email is error!");
return -1;
}
else {
success("Received e-mail address!");
}
return 1;
}
int check_receive_register_user_data() {
WIN32_FIND_DATA f;
HANDLE h = FindFirstFile("users//*.txt", &f);
if(h != INVALID_HANDLE_VALUE) {
do {
DWORD dwNumRead;
char* filename = (char*)malloc(strlen(f.cFileName) + strlen("users//"));
sprintf(filename, "users//%s", f.cFileName);
h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
int filesize = GetFileSize(h, NULL);
char* buffer = (char*)malloc(filesize);
ReadFile(h, buffer, filesize, &dwNumRead, NULL);
buffer[filesize] = '\0';
char* username = (char*)malloc(strlen(user.username)+1);
sprintf(username, "%s\n", user.username);
char* email = (char*)malloc(strlen(user.email)+1);
sprintf(email, "%s\n", user.email);
if (strstr(buffer, username) != NULL) {
error("The username is already in use!");
send_string_size("in use username");
send_string("in use username", strlen("in use username"));
return -1;
}
if (strstr(buffer, email) != NULL) {
error("The e-mail address is already in use!");
send_string_size("in use email");
send_string("in use email", strlen("in use email"));
return -1;
}
} while(FindNextFile(h, &f) != 0);
}
success("The username is free!");
send_string_size("free username");
send_string("free username", strlen("free username")); //Let the server know the username is free.
success("The e-mail address is free!");
send_string_size("free email");
send_string("free email", strlen("free email")); //Let the server know the username is free.
FindClose(h);
return 1;
}
int store_register_user_data() {
FILE* file;
int id = 0;
char filename[1024];
while (1) {
sprintf((char*)filename, "users/%d.txt", id);
if (fopen(filename, "r") != NULL) {
id++;
continue;
}
else {
break;
}
}
if ((file = fopen(filename, "w+")) == NULL) {
printf("Error opening file %s!", filename);
return -1;
}
else {
if (fprintf(file, "Username: %s\nPassword: %s\nE-Mail Address: %s", user.username, user.password, user.email) == NULL) {
printf("Error writing to file %s!\n", filename);
return -1;
}
else {
printf("Wrote Username: %s\nPassword: %s\nE-Mail Address: %s to file %s!", user.username, user.password, user.email, filename);
}
}
return 1;
}
int cleanup () {
if (shutdown(server, SD_BOTH) != 0) {
printf("Could not shutdown the socket's send and receive functions!\n");
}
else {
printf("Shutdown socket!\n");
}
if (closesocket(server) != 0) {
printf("Could not close the socket!\n");
return -1;
}
else {
printf("Closed socket!\n");
}
if (WSACleanup() != 0) {
printf("Could not empty the loaded WinSock libraries!\n");
return -1;
}
else {
printf("Unloaded WinSock libraries!\n");
}
free(receive_buffer_size_string);
free(send_buffer_size_string);
free(receive_buffer);
free(send_buffer);
return 1;
}
int main() {
if (startup() == 1) {
if (get_user_status() == false) {
if (strcmp(receive_function(), "register") == 0) {
if (receive_register_user_data() == 1) {
if (check_receive_register_user_data() == 1) {
/*if (store_register_user_data() == 1) {
}*/
}
}
}
}
}
cleanup();
system("pause");
return 0;
}
Here is my header file:
#define _WINSOCKAPI_
#undef UNICODE
#include <windows.h>
#include <stdio.h>
#include <winsock2.h>
struct user;
struct message;
struct comment;
struct announcment;
void error(char* string);
void success(char* string);
int receive_string_size();
char* receive_string(int receive_buffer_size);
int send_string_size(char* string);
int send_string(char* string, int send_buffer_size);
int startup();
bool get_user_status();
char* receive_function();
int receive_register_user_data();
int check_register_user_data();
int store_register_user_data();
int cleanup();
SOCKET server;
SOCKET client;
int result;
char* receive_buffer;
char* receive_buffer_size_string;
char* send_buffer;
char* send_buffer_size_string;
struct user {
int id;
char* username;
char* password;
char* email;
char* date;
char* time;
};
struct message {
int id;
char* recipient[16];
char* sender[16];
char* subject;
char* string;
char* date[32];
char* time[16];
};
struct comment {
int id;
char* recipient[16];
char* sender[16];
char* string;
char* date[32];
char* time[16];
};
struct announcment {
int id;
char* creator[16];
char* string;
char* date[32];
char* time[16];
};
user user;
I am compiling with Microsoft Visual Studio 2008.
If any more information is required, I will be more than happy to post.
I want the server to find every file in directory, open it, read the username string, and see if the username sent from the client via a packet is the same as the string from the file.
I get this error:
Unhandled exception at 0x7c901010 in Server.exe: 0xC0000005: Access violation reading location 0x00000fb4.
This error lead me to string.h a few times, then it lead me to osinfo.h.
Here is the function I am having problems with (everything before this is perfect for me), with the error causing line marked.
int check_receive_register_user_data() {
WIN32_FIND_DATA f;
HANDLE h = FindFirstFile("users//*.txt", &f);
if(h != INVALID_HANDLE_VALUE) {
do {
DWORD dwNumRead;
char* filename = (char*)malloc(strlen(f.cFileName) + strlen("users//"));
sprintf(filename, "users//%s", f.cFileName);
h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
int filesize = GetFileSize(h, NULL);
char* buffer = (char*)malloc(filesize);
ReadFile(h, buffer, filesize, &dwNumRead, NULL);
buffer[filesize] = '\0';
char* username = (char*)malloc(strlen(user.username)+1);
sprintf(username, "%s\n", user.username);
char* email = (char*)malloc(strlen(user.email)+1);
sprintf(email, "%s\n", user.email);
if (strstr(buffer, username) != NULL) {
error("The username is already in use!");
send_string_size("in use username");
send_string("in use username", strlen("in use username"));
return -1;
}
if (strstr(buffer, email) != NULL) {
error("The e-mail address is already in use!");
send_string_size("in use email");
send_string("in use email", strlen("in use email"));
return -1;
}
} while(FindNextFile(h, &f) != 0); <<<< THIS TRIGGERS THE ERROR I AM POSTING ABOUT, EVERYTHING BEFORE THIS IS 100% CORRECT IN TERMS OF VALUE
}
success("The username is free!");
send_string_size("free username");
send_string("free username", strlen("free username")); //Let the server know the username is free.
success("The e-mail address is free!");
send_string_size("free email");
send_string("free email", strlen("free email")); //Let the server know the username is free.
FindClose(h);
return 1;
}
Here is my whole code.
#include "Server.h"
void error(char* string) {
printf("Error! %s\n", string);
}
void success(char* string) {
printf("Success! %s\n", string);
}
int send_string_size(char* string) {
int send_buffer_size = strlen(string);
send_buffer_size_string = (char*)malloc(sizeof(send_buffer_size));
sprintf(send_buffer_size_string, "%d", send_buffer_size);
if (send(client, send_buffer_size_string, sizeof(send_buffer_size_string), 0) == -1) {
error("Unable to send packet size!");
free(send_buffer_size_string);
return -1;
}
return send_buffer_size;
}
int send_string(char* string, int send_buffer_size) {
send_buffer = (char*)malloc(send_buffer_size);
sprintf(send_buffer, "%s", string);
if (send(client, send_buffer, send_buffer_size, 0) == -1) {
error("Unable to send packet!");
free(send_buffer);
return -1;
}
return 1;
}
int receive_string_size() {
char* receive_buffer_size_string = (char*)malloc(4);
int receive_buffer_size;
if (recv(client, receive_buffer_size_string, sizeof(receive_buffer_size_string), 0) == -1) {
error("Unable to recieve packet size!");
return -1;
}
else {
receive_buffer_size = atoi(receive_buffer_size_string);
}
return receive_buffer_size;
}
char* receive_string(int receive_buffer_size) {
receive_buffer = (char*)malloc(receive_buffer_size+1);
if (recv(client, receive_buffer, receive_buffer_size, 0) == -1) {
error("Unable to recieve packet!");
return "error";
}
else {
receive_buffer[receive_buffer_size] = '\0';
}
return receive_buffer;
}
int startup() {
WSADATA WSAData;
if (WSAStartup(0x0202, &WSAData) != 0) {
error("WSAStartup failed!");
return -1;
}
else {
success("WSAStartup succeeded!");
}
SOCKET server = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(80);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (bind(server, (LPSOCKADDR)&serveraddr, sizeof(serveraddr)) != 0) {
error("Could not bind!");
return -1;
}
else {
success("Binded!");
}
if (listen(server, 12) != 0) {
error("Could not listen!");
return -1;
}
else {
success("Listening!");
}
if ((client = accept(server, NULL, NULL)) == INVALID_SOCKET) {
error("Could not accept!");
return -1;
}
else {
success("Accepted a user!\n");
}
return 1;
}
bool get_user_status() {
int login_status_string_size = receive_string_size();
char* user_status = (char*)malloc(login_status_string_size);
sprintf(user_status, "%s", receive_string(login_status_string_size));
if (strcmp(user_status, "not logged in") == 0) {
success("The user is not logged in!");
return false;
}
else if (strcmp(user_status, "logged in") == 0) {
error("The user is logged in!");
return true;
}
}
char* receive_function() {
return receive_string(receive_string_size());
}
int receive_register_user_data() {
int username_length = receive_string_size();
user.username = (char*)malloc(username_length);
sprintf(user.username, "%s", receive_string(username_length));
if (strcmp(user.username, "error") == 0) {
error("user.username is error!");
return -1;
}
else {
success("Received username!");
}
int password_length = receive_string_size();
user.password = (char*)malloc(password_length);
sprintf(user.password, "%s", receive_string(password_length));
if (strcmp(user.password, "error") == 0) {
error("user.password is error!");
return -1;
}
else {
success("Received password!");
}
int email_length = receive_string_size();
user.email = (char*)malloc(email_length);
sprintf(user.email, "%s", receive_string(email_length));
if (strcmp(user.email, "error") == 0) {
error("user.email is error!");
return -1;
}
else {
success("Received e-mail address!");
}
return 1;
}
int check_receive_register_user_data() {
WIN32_FIND_DATA f;
HANDLE h = FindFirstFile("users//*.txt", &f);
if(h != INVALID_HANDLE_VALUE) {
do {
DWORD dwNumRead;
char* filename = (char*)malloc(strlen(f.cFileName) + strlen("users//"));
sprintf(filename, "users//%s", f.cFileName);
h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
int filesize = GetFileSize(h, NULL);
char* buffer = (char*)malloc(filesize);
ReadFile(h, buffer, filesize, &dwNumRead, NULL);
buffer[filesize] = '\0';
char* username = (char*)malloc(strlen(user.username)+1);
sprintf(username, "%s\n", user.username);
char* email = (char*)malloc(strlen(user.email)+1);
sprintf(email, "%s\n", user.email);
if (strstr(buffer, username) != NULL) {
error("The username is already in use!");
send_string_size("in use username");
send_string("in use username", strlen("in use username"));
return -1;
}
if (strstr(buffer, email) != NULL) {
error("The e-mail address is already in use!");
send_string_size("in use email");
send_string("in use email", strlen("in use email"));
return -1;
}
} while(FindNextFile(h, &f) != 0);
}
success("The username is free!");
send_string_size("free username");
send_string("free username", strlen("free username")); //Let the server know the username is free.
success("The e-mail address is free!");
send_string_size("free email");
send_string("free email", strlen("free email")); //Let the server know the username is free.
FindClose(h);
return 1;
}
int store_register_user_data() {
FILE* file;
int id = 0;
char filename[1024];
while (1) {
sprintf((char*)filename, "users/%d.txt", id);
if (fopen(filename, "r") != NULL) {
id++;
continue;
}
else {
break;
}
}
if ((file = fopen(filename, "w+")) == NULL) {
printf("Error opening file %s!", filename);
return -1;
}
else {
if (fprintf(file, "Username: %s\nPassword: %s\nE-Mail Address: %s", user.username, user.password, user.email) == NULL) {
printf("Error writing to file %s!\n", filename);
return -1;
}
else {
printf("Wrote Username: %s\nPassword: %s\nE-Mail Address: %s to file %s!", user.username, user.password, user.email, filename);
}
}
return 1;
}
int cleanup () {
if (shutdown(server, SD_BOTH) != 0) {
printf("Could not shutdown the socket's send and receive functions!\n");
}
else {
printf("Shutdown socket!\n");
}
if (closesocket(server) != 0) {
printf("Could not close the socket!\n");
return -1;
}
else {
printf("Closed socket!\n");
}
if (WSACleanup() != 0) {
printf("Could not empty the loaded WinSock libraries!\n");
return -1;
}
else {
printf("Unloaded WinSock libraries!\n");
}
free(receive_buffer_size_string);
free(send_buffer_size_string);
free(receive_buffer);
free(send_buffer);
return 1;
}
int main() {
if (startup() == 1) {
if (get_user_status() == false) {
if (strcmp(receive_function(), "register") == 0) {
if (receive_register_user_data() == 1) {
if (check_receive_register_user_data() == 1) {
/*if (store_register_user_data() == 1) {
}*/
}
}
}
}
}
cleanup();
system("pause");
return 0;
}
Here is my header file:
#define _WINSOCKAPI_
#undef UNICODE
#include <windows.h>
#include <stdio.h>
#include <winsock2.h>
struct user;
struct message;
struct comment;
struct announcment;
void error(char* string);
void success(char* string);
int receive_string_size();
char* receive_string(int receive_buffer_size);
int send_string_size(char* string);
int send_string(char* string, int send_buffer_size);
int startup();
bool get_user_status();
char* receive_function();
int receive_register_user_data();
int check_register_user_data();
int store_register_user_data();
int cleanup();
SOCKET server;
SOCKET client;
int result;
char* receive_buffer;
char* receive_buffer_size_string;
char* send_buffer;
char* send_buffer_size_string;
struct user {
int id;
char* username;
char* password;
char* email;
char* date;
char* time;
};
struct message {
int id;
char* recipient[16];
char* sender[16];
char* subject;
char* string;
char* date[32];
char* time[16];
};
struct comment {
int id;
char* recipient[16];
char* sender[16];
char* string;
char* date[32];
char* time[16];
};
struct announcment {
int id;
char* creator[16];
char* string;
char* date[32];
char* time[16];
};
user user;
I am compiling with Microsoft Visual Studio 2008.
If any more information is required, I will be more than happy to post.