Difference between revisions of "Server.c"
m |
(begin message recv and process structure) |
||
| Line 6: | Line 6: | ||
#include <sys/socket.h> | #include <sys/socket.h> | ||
#include <netinet/in.h> | #include <netinet/in.h> | ||
| − | #include <arpa/inet.h> | + | //#include <arpa/inet.h> |
| − | #include <netdb.h> | + | //#include <netdb.h> |
| − | #include <unistd.h> | + | //#include <unistd.h> |
#endif | #endif | ||
| − | // | + | // Set up socket and listening loop |
#define LISTENPORT 2012 | #define LISTENPORT 2012 | ||
#define BACKLOG 10 | #define BACKLOG 10 | ||
#define MSG "stink ow!" | #define MSG "stink ow!" | ||
| + | int processMessage(char* msg); | ||
int sock, conn; | int sock, conn; | ||
struct sockaddr_in my_addr, client_addr; | struct sockaddr_in my_addr, client_addr; | ||
| Line 22: | Line 23: | ||
char response[80]; | char response[80]; | ||
| − | //get a socket | + | // get a socket |
| − | if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) | + | if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { |
perror("socket"); | perror("socket"); | ||
exit(1); | exit(1); | ||
} | } | ||
| − | //make it reusable | + | // make it reusable |
| − | if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&sockopt_on,sizeof(int)) | + | if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sockopt_on, sizeof(int)) < 0) { |
perror("setsockopt"); | perror("setsockopt"); | ||
exit(1); | exit(1); | ||
} | } | ||
| − | //first zero the struct | + | // first zero the struct |
memset((char *) &my_addr, 0, sa_in_size); | memset((char *) &my_addr, 0, sa_in_size); | ||
| − | //now fill in the fields we need | + | // now fill in the fields we need |
my_addr.sin_family = PF_INET; | my_addr.sin_family = PF_INET; | ||
my_addr.sin_port = htons(LISTENPORT); | my_addr.sin_port = htons(LISTENPORT); | ||
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); | my_addr.sin_addr.s_addr = htonl(INADDR_ANY); | ||
| − | //bind our socket to the port | + | // bind our socket to the port |
| − | if (bind(sock,(struct sockaddr *)&my_addr, sa_in_size) | + | if (bind(sock, (struct sockaddr *)&my_addr, sa_in_size) < 0) { |
perror("bind"); | perror("bind"); | ||
exit(1); | exit(1); | ||
} | } | ||
| − | //start listening for incoming connections | + | // start listening for incoming connections |
| − | if (listen(sock,BACKLOG) | + | if (listen(sock, BACKLOG) < 0) { |
perror("listen"); | perror("listen"); | ||
exit(1); | exit(1); | ||
} | } | ||
| + | int bufsize = 1024; | ||
| + | char *buf = malloc(bufsize); | ||
while(1) { | while(1) { | ||
| − | //grab connections | + | // grab connections |
| − | + | if (stream = accept(sock, (struct sockaddr *)&client_addr, &sa_in_size) < 0) { | |
| − | |||
perror("accept"); | perror("accept"); | ||
exit(1); | exit(1); | ||
} | } | ||
| − | //log the connecter | + | // log the connecter |
| + | // - should get info for this stream, incl buf | ||
printf("got connection from %s\n", inet_ntoa(client_addr.sin_addr)); | printf("got connection from %s\n", inet_ntoa(client_addr.sin_addr)); | ||
| − | //send a greeting | + | // send a greeting - should do this in response |
| − | if (send( | + | if (send(stream, MSG, strlen(MSG)+1, 0) == -1) { |
perror("send"); | perror("send"); | ||
} | } | ||
| − | //get the reply | + | // get the reply |
| − | if (recv( | + | // - should keep receiving until \r\n\0?, then call serverProcessMessage() |
| − | + | if (recv(stream, buf, bufsize, 0) == -1) perror("recv"); | |
| − | + | else printf("The client says \"%s\"\n", buf); | |
| − | printf("The client says \"%s\"\n", | + | |
| − | close( | + | close(stream); // should close when no more data on this stream (somehow) |
| + | |||
| + | } | ||
| + | // Parses a message content and responds to client | ||
| + | int processMessage(char* msg) { | ||
| + | // test if restart cmd first | ||
} | } | ||
Revision as of 06:34, 2 July 2006
// - todo: don't exit on connect errors, keep trying every 10s // Includes for socket (trying to use one source cpp for osx,win32,*ux)
- ifdef WINDOWS
- include <winsock.h>
- else
- include <sys/socket.h>
- include <netinet/in.h>
//#include <arpa/inet.h> //#include <netdb.h> //#include <unistd.h>
- endif
// Set up socket and listening loop
- define LISTENPORT 2012
- define BACKLOG 10
- define MSG "stink ow!"
int processMessage(char* msg); int sock, conn; struct sockaddr_in my_addr, client_addr; int sockopt_on = 1; int sa_in_size = sizeof(struct sockaddr_in); char response[80];
// get a socket if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("socket"); exit(1); }
// make it reusable if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sockopt_on, sizeof(int)) < 0) { perror("setsockopt"); exit(1); }
// first zero the struct memset((char *) &my_addr, 0, sa_in_size);
// now fill in the fields we need my_addr.sin_family = PF_INET; my_addr.sin_port = htons(LISTENPORT); my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// bind our socket to the port if (bind(sock, (struct sockaddr *)&my_addr, sa_in_size) < 0) { perror("bind"); exit(1); }
// start listening for incoming connections if (listen(sock, BACKLOG) < 0) { perror("listen"); exit(1); }
int bufsize = 1024; char *buf = malloc(bufsize); while(1) { // grab connections if (stream = accept(sock, (struct sockaddr *)&client_addr, &sa_in_size) < 0) { perror("accept"); exit(1); }
// log the connecter // - should get info for this stream, incl buf printf("got connection from %s\n", inet_ntoa(client_addr.sin_addr));
// send a greeting - should do this in response if (send(stream, MSG, strlen(MSG)+1, 0) == -1) { perror("send"); }
// get the reply // - should keep receiving until \r\n\0?, then call serverProcessMessage() if (recv(stream, buf, bufsize, 0) == -1) perror("recv"); else printf("The client says \"%s\"\n", buf);
close(stream); // should close when no more data on this stream (somehow)
}
// Parses a message content and responds to client int processMessage(char* msg) { // test if restart cmd first }



