Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations IamaSherpa on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

C struct 3

Status
Not open for further replies.

starz123

Programmer
Feb 23, 2008
1
US
How can I cast a C struct to a char array??

If i have something like

typedef struct
{
char ID[3];
short length;
char msg[14];

} message;

How can I typecast it to a char array so that I won't have the problem of padded bytes in using the struct message??

Thanks
 
I think you're looking for something like this:

Code:
typedef struct
{
char ID[3];
short length; 
char msg[14];

} __attribute__((__packed__)) message;

at least thats what I'm assuming your eventually getting at..
 
To make it portable to all C compilers you probably need to
serialize into byte array for each member separately.
Or just invoke compiler with option not to use padding (but this will apply for all structs). In any case, there is performance hit. Or you can use compiler dependent feature to disable padding from source code, as in upper example or sometimes #pragma.
 
Depends on what you're going to do with it. On many machines, if you try to use length, you'll probably get a SIGBUS or Bus error.

If you're serializing for the purposes of transferring to another machine, then you need to do each member separately, especially if the receiving machine is a completely different architecture.

If it is the same architecture, I wouldn't bother with unpadding it

In Windows, lookup #pragma pack in the help.
 
Hello,

I have developed a client server application using C.

i have a list of usernames and a list of passwords in a text file. i need to be able to do 2 loops so i can send the usernames and the passwords to the server and get a response back. basically its a ftp force attack to find the correct username and password. i have written most of the code but i'm kind of strugling to finish it off and sort out the errors. this is a task we have to do for university. i have tried different books and websites and still can't sort out the errors. i really need your help.

Any advice would be most helpfull

this is the client part:

#include <stdio.h> /* for printf() and fprintf() */
#include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
#include <arpa/inet.h> /* for sockaddr_in and inet_addr() */
#include <stdlib.h> /* for atoi() and exit() */
#include <string.h> /* for memset() */
#include <unistd.h> /* for close() */

#define BUFSIZE 4096 /* Size of receive buffer */

void DieWithError(char *errorMessage); /* Error handling function */
void handeltcpclient(int sock, char *argv[]); /* Server handling function */

int main(int argc, char *argv[])
{
int sock; /* Socket descriptor */
struct sockaddr_in echoServAddr; /* Echo server address */
unsigned short echoServPort; /* Echo server port */
char *servIP; /* Server IP address (dotted quad) */

if ((argc < 2) || (argc > 3)) /* Test for correct number of arguments */
{
fprintf(stderr, "Usage: %s <Server IP> [<Port>]\n",argv[0]);
exit(1);
}

servIP = argv[1]; /* First arg: server IP address (dotted quad) */

if (argc == 3)
echoServPort = atoi(argv[2]); /* Use given port, if any */
else
echoServPort = 21; /* 7 is the well-known port for the echo service */

/* Create a reliable, stream socket using TCP */
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() failed");

/* Construct the server address structure */
memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
echoServAddr.sin_family = AF_INET; /* Internet address family */
echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */
echoServAddr.sin_port = htons(echoServPort); /* Server port */

/* Establish the connection to the echo server */
if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
DieWithError("connect() failed");

handeltcpclient(sock, argv);

close(sock);
}



this is the handeltcpclient.c

#include <stdio.h> /* for printf() and fprintf() */
#include <string.h> /* for printf() and fprintf() */
#include <sys/socket.h> /* for recv() and send() */
#include <unistd.h> /* for close() */

#define BUFSIZE 4096 /* Size of receive buffer */

void DieWithError(char *errorMessage); /* Error handling function */
char sendBuf[BUFSIZE]; /* Send Buffer */
char rcvBuf[BUFSIZE];
char rcvMsgSize[BUFSIZE];
char srvBuf[BUFSIZE];
char clntBuf[BUFSIZE];
char USER[15];
char PASS[15];
FILE *fileuser;
FILE *filepassword;
int MsgSize;
int result;
char response[3];

void handeltcpclient(int clntSocket)
{


/* Recieve message from client */
memset(&rcvBuf,0,sizeof(rcvBuf));
rcvMsgSize = RecieveMessage(clntSocket, &rcvBuf, sizeof(rcvBuf));

/* Recieve Server Responses */
memset (&clntBuf,0,sizeof(clntBuf));
memset (&srvBuf,0,sizeof(srvBuf));
MsgSize = RecieveMessage(clntSocket,&srvBuf, sizeof(srvBuf));

printf("Recieved: %s" &srvBuf,rcvMsgSize);

response = strncpy(&srvBuf, 3);
result = strcmp( result, "230");
if( result == 0)
{
sprintf(&clntBuf, "USER %s", USER);
send(clntSocket, &clntBuf, strlen(clntBuf), 0)!= (strlen(clntBuf));
DieWithError("send() sent a different number of bytes than expected");


printf("Recieved: %s" &srvBuf,messageSize);


/* Opening username.txt to selecting USER */

if (fileuser = (fopen ("usernames.txt", "r")) ==NULL)
{
printf("Error opening file.\n");
return 1;
}

else {
printf ("File opened.\n");
while (fgets(USER, 15, file != NULL))
{
printf("%s",USER);
}

/*send USER to server*/
sprintf(clntBuf, "USER %s", USER);

if ( send(clntSocket, &clntBuf, strlen(clntBuf), 0)!= (strlen(clntBuf)))
DieWithError("send() sent a different number of bytes than expected");

printf("The attemped username was: %s\n");
return 0;

/* Recieve message from client */
memset(&rcvBuf,0,sizeof(rcvBuf));
rcvMsgSize = RecieveMessage(clntSocket, &rcvBuf, sizeof(rcvBuf));

response = strncpy(&srvBuf, 3);
result = strcmp( result, "331");
if( result == 0)
{
sprintf(&clntBuf, "PASS %s", PASS);
send(clntSocket, &clntBuf, strlen(clntBuf), 0)!= (strlen(clntBuf));
DieWithError("send() sent a different number of bytes than expected");

result = strncpy(&srvBuf, 3);
result = strcmp(result, "230");

if (result == 0)
{
printf("successfully connected.\n");
{
sucess ++;
}


/* Opening passwords.txt to selecting PASS */
(
if (filepassword = (fopen ("passwords.txt", "r"))==NULL)
{
printf("Error opening file.\n");
return 1;
}
(
else {
printf ("File opened.\n");
while (fgets(PASS, 15,file)!=NULL)
{
printf("%s",PASS);
}
}
/*send PASS to server*/
sprintf(clntBuf, "PASS %s", PASS);

if ( send(clntSocket, &clntBuf, strlen(clntBuf), 0) != (strlen(clntBuf)))
DieWithError("send() sent a different number of bytes than expected");

printf("Closing file.\n");
fclose(file);
printf("The attempted password was: %s\n");
return 0;

}

int RecieveMessage (int s,char *buf, int maxLen)
{
int received = 0;
int rv = 0;
rv = recv(s, buf+received, 5, 0);
while ((received < maxLen) && (rv > 0) && *(buf+received) != '\n')
{
received += rv;
rv = recv(s, buf+received, 5, 0);
}
if (rv < 0)
{
DieWithError("revc() failed");
}
return received;
}

/*end*/

this is the diewitherror.c (error handling file)

#include <stdio.h> /* for perror() */
#include <stdlib.h> /* for exit() */

void DieWithError(char *errorMessage)
{
perror(errorMessage);
exit(1);
}
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top