I didn't fancy it swearing at me.
Sure, I can compile it. I get quite a few warnings when I do . . . .
Code:
In file included from escrypt.c:32:
escrypt.h: In function ‘ecscrypto’:
escrypt.h:14: warning: control reaches end of non-void function
escrypt.h: At top level:
escrypt.h:8: warning: unused parameter ‘buffer’
escrypt.h: In function ‘ecsdecrypto’:
escrypt.h:22: warning: control reaches end of non-void function
escrypt.h: At top level:
escrypt.h:16: warning: unused parameter ‘buffer’
escrypt.c: In function ‘main’:
escrypt.c:45: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[16]’
escrypt.c:48: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[5]’
escrypt.c:60: warning: passing argument 2 of ‘connect’ from incompatible pointer type
escrypt.c:111: warning: passing argument 2 of ‘bind’ from incompatible pointer type
escrypt.c:125: warning: passing argument 2 of ‘accept’ from incompatible pointer type
escrypt.c:125: warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness
escrypt.c:159: warning: control reaches end of non-void function
escrypt.c: At top level:
escrypt.c:34: warning: unused parameter ‘argc’
escrypt.c:34: warning: unused parameter ‘argv’
[edit] Here's how I got it to compile. I also changed the functions in the header file to return void.
Code:
/*
* File: ecs.c
* Author: cookie
*
* Created on June 30, 2008, 3:02 AM
*/
/*VARIABLES*/
int choice;
char port[5];
int clisock, servsock;
struct sockaddr_in clisock_addr;
struct sockaddr_in servsock_addr;
char ip[16];
char pass[] = "rightdoggy";
int addrlen, servaddrlen;
char buff[48000];
int i;
int recvcheck;
/*ENDOFVARS*/
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include "escript.h"
int main(int argc, char** argv)
{
printf("\n---------Welcome---------\n");
printf("\n1. Connect\n2. Listen For Conenction\n");
printf("\n-------------------------\n");
scanf("%d", &choice);
system("clear");
switch(choice)
{
case 1:
printf("Target IP: ");
scanf("%s", ip);
system("clear");
printf("Port: ");
scanf("%s", port);
system("clear");
clisock = socket(AF_INET, SOCK_STREAM, 0);
if(clisock == -1)
{
printf("Error Creating Socket");
exit(1);
}
clisock_addr.sin_family = AF_INET;
clisock_addr.sin_port = htons(2110);
clisock_addr.sin_addr.s_addr = inet_addr(ip);
addrlen = sizeof(clisock_addr);
if(connect(clisock, (struct sockaddr *)&clisock_addr, addrlen) == -1)
{
printf("Error Connecting To Target\n");
getchar();
}
else
{
printf("Established Connection\n");
pid_t frk = fork();
while(1)
{
if(frk > 0)
{
printf("\nMessage to serv: ");
fgets(buff, 48000, stdin);
ecscrypto(buff);
send(clisock, &buff, sizeof(buff), 0);
}
else if(frk == 0)
{
recvcheck = recv(clisock, &buff, sizeof(buff), 0);
if(recvcheck != 0 && recvcheck != -1)
{
ecsdecrypto(buff);
printf("\nMessage from serv: %s\n", buff);
}
}
else if(frk == -1)
{
printf("\nERROR FORKING\n");
exit(1);
}
}
}
close(clisock);
break;
case 2:
printf("Hello!\n");
servsock = socket(AF_INET, SOCK_STREAM, 0);
if(servsock == -1)
{
printf("\nERROR CREATING SOCKET\n");
exit(1);
}
printf("before addrs\n");
servsock_addr.sin_family = AF_INET;
servsock_addr.sin_port = htons(2110);
servsock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddrlen = sizeof(servsock_addr);
printf("after addrs\n");
if(bind(servsock, (struct sockaddr *)&servsock_addr, servaddrlen) == -1)
{
printf("\nERROR BINDING SOCKET\n");
exit(1);
}
printf("Bound socket\n");
if(listen(servsock, 5) == -1)
{
printf("\nERROR CREATING BACKLOG\n");
exit(1);
}
printf("Created backlog\n");
printf("Now Accepting Connections...\n");
clisock = accept(servsock, (struct sockaddr *)&clisock_addr, (socklen_t *)&addrlen);
if(clisock == -1)
{
printf("\nERROR ESTABLISHING CONECTION\n");
exit(1);
}
printf("\nCONNECTION ESTABLISHED\n");
pid_t frkserv = fork();
while(1)
{
if(frkserv > 0)
{
recvcheck = recv(clisock, &buff, sizeof(buff), 0);
if(recvcheck != 0 && recvcheck != -1)
{
ecsdecrypto(buff);
printf("\nMessage from client: %s\n", buff);
}
}
else if(frkserv == 0)
{
printf("Message to client: ");
fgets(buff, 48000, stdin);
ecscrypto(buff);
send(clisock, &buff, sizeof(buff), 0);
}
else if(frkserv == -1)
{
printf("ERROR FORKING");
exit(1);
}
}
break;
}
return 0;
}
I see what you mean about extra messages being printed.
server:
Code:
Hello!
before addrs
after addrs
Bound socket
Created backlog
Now Accepting Connections...
CONNECTION ESTABLISHED
Message to client: Message to client: Message from client:
Message from client:
Message from client: message 1
Message from client:
Message from client: message 2
Message from client:
Message from client: message 3
Message from client:
client:
Code:
Established Connection
Message from serv:
Message to serv:
Message to serv: message 1
Message to serv: message 2
Message to serv: message 3
Message to serv:
I don't know why that is, I'm not familiar enough with BSD sockets. I suspect, however, it's in the way you read from the socket.
First of all, recv() returns 0 "when the peer has performed an orderly shutdown", and -1 on error. [/edit]