[Cruce-commit] SF.net SVN: cruce:[18] C/trunk
Status: Beta
Brought to you by:
caiusb
|
From: <ca...@us...> - 2010-03-10 11:54:38
|
Revision: 18
http://cruce.svn.sourceforge.net/cruce/?rev=18&view=rev
Author: caiusb
Date: 2010-03-10 11:54:31 +0000 (Wed, 10 Mar 2010)
Log Message:
-----------
Am uitat sa pun serverul.
Added Paths:
-----------
C/trunk/server/
C/trunk/server/Makefile
C/trunk/server/server.c
C/trunk/server/server.h
C/trunk/server/server_dummy.c
Added: C/trunk/server/Makefile
===================================================================
--- C/trunk/server/Makefile (rev 0)
+++ C/trunk/server/Makefile 2010-03-10 11:54:31 UTC (rev 18)
@@ -0,0 +1,23 @@
+objects = server.o protocol.o
+
+server: $(objects)
+ cc -o server $(objects)
+
+client.o: server.c ../protocol/protocol.h
+ cc -c server.c
+
+protocol.o: ../protocol/protocol.h ../protocol/protocol.c
+ cc -c ../protocol/protocol.c
+
+#dummy server
+dummy: dummy.o
+ cc -o dummy server_dummy.o protocol.o
+
+
+dummy.o: server_dummy.c ../protocol/protocol.h
+ cc -c server_dummy.c
+
+clean:
+ rm -f $(objects)
+ rm -f server
+ rm -f dummy
Added: C/trunk/server/server.c
===================================================================
--- C/trunk/server/server.c (rev 0)
+++ C/trunk/server/server.c 2010-03-10 11:54:31 UTC (rev 18)
@@ -0,0 +1,219 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+//Our libraries
+#include "server.h"
+#include "protocol.h"
+
+
+#define NUMAR_ECHIPE 2
+
+
+ //Server related fields
+struct echipa echipe[NUMAR_ECHIPE];
+struct sockaddr_in serverSocketAddress;
+char serverIP[16];
+int serverPort;
+int server_sfd;
+char messageDelimiter[] = " ";
+FILE *outputInfo;// = stdout;
+FILE *outputError;// = stdout;
+
+void decodeMessage(char message[], struct jucator sender)
+{
+
+ if(message == NULL)
+ {
+ informationMessage(outputError, "The message is NULL!");
+ exit(1);
+ }
+
+ informationMessage(outputInfo, "Starting message decoding");
+
+ //Starting to decode the message
+ char *header = strtok(message, messageDelimiter);
+
+ informationMessage(outputInfo, "header = %s" , header);
+
+ if(header == NULL)
+ {
+ informationMessage(outputError,"Error at separating the message header!\n");
+ exit(0);
+ }
+
+ char *rest = strtok(NULL, messageDelimiter);
+
+ int messageType = atoi(header);
+
+ if(messageType == 0)
+ {
+ informationMessage(outputError, "Error decoding the message header!\n");
+ exit(0);
+ }
+ informationMessage(outputInfo, "Successful message header separation.\n");
+
+ switch(messageType)
+ {
+ case JOIN_GAME:
+ {
+ int i;
+ int j;
+ for (i = 0; i < NUMAR_ECHIPE; i++)
+ {
+ if(echipe[i].jucatori_activi < JUCATORI_PER_ECHIPA)
+ {
+ echipe[i].jucatori[echipe[i].jucatori_activi++] = sender;
+ }
+ }
+
+ if(i == NUMAR_ECHIPE)
+ {
+ sendNACKMessage(sender, "Nu mai sunt locuri!\n");
+ }
+
+ //sending an acknowledge message
+ sendAckMessage(sender, "Cerere acceptata.\n");
+
+
+ for (i = 0; i < NUMAR_ECHIPE; i++)
+ {
+ for (j = 0; j < echipe[i].jucatori_activi; j++)
+ {
+ //To sent information message to the rest of players
+ }
+ }
+ break;
+ }
+ }
+
+}
+
+void sendAckMessage(struct jucator receiver, char message[])
+{
+ //adding the header
+ char buffer[100];
+ sprintf(buffer, "%d %s", ACK, message);
+
+ write(receiver.sfd, &message, strlen(message) * sizeof(char));
+}
+
+void sendNACKMessage(struct jucator receiver, char message[])
+{
+ //adding header
+ //adding the header
+ char buffer[100];
+ sprintf(buffer, "%d %s", NACK, message);
+
+ write(receiver.sfd, &message, strlen(message) * sizeof(char));
+}
+
+void informationMessage(FILE *output, char message[])
+{
+ fprintf(output, "%s", message);
+}
+
+
+void setUpServer(char ip[], int port)
+{
+ printf("Starting to set up the server.\n");
+ strcpy(serverIP, ip);
+ serverPort = port;
+
+ //Setting up the sever socket
+ server_sfd = socket(PF_INET, SOCK_STREAM, 0);
+ if (server_sfd == -1)
+ {
+ perror("Error creating Server socket!\n");
+ exit(1);
+ }
+ memset(&serverSocketAddress, 0, sizeof(struct sockaddr_in));
+ serverSocketAddress.sin_family = AF_INET;
+ if (inet_aton(serverIP, &serverSocketAddress.sin_addr) == 0)
+ {
+ perror("Address not valid!\n");
+ exit(1);
+ }
+ serverSocketAddress.sin_port = htons(serverPort);
+
+ if (bind(server_sfd, (struct server *) &serverSocketAddress, sizeof(struct sockaddr_in)) == -1)
+ {
+ perror("Error binding to address");
+ exit(1);
+ }
+
+ printf("Server set up to IP address: %s and binded to port %d.\n", serverIP, serverPort);
+}
+
+void startListening(int server_sfd)
+{
+ if (listen(server_sfd, 100) == -1)
+ {
+ perror("Error listening to socket");
+ exit(1);
+ }
+ else
+ {
+ printf("Server starting to listen.\n");
+ }
+}
+
+int acceptConnection(int socketFileDescriptor)
+{
+ informationMessage(outputInfo, "Accepting a connection request");
+ struct sockaddr_in in_conn;
+ socklen_t socksize = sizeof(struct sockaddr_in);
+
+ memset(&in_conn, 0, sizeof(struct sockaddr_in));
+
+ int connFileDescriptor = accept(socketFileDescriptor, (struct sockaddr *) &in_conn, &socksize);
+
+ if (connFileDescriptor == -1)
+ {
+ informationMessage(outputError, "Error accepting connection");
+ exit(1);
+ }
+
+ /*
+ char *c = sprintf("Received connection from: %s\n", inet_ntoa(in_conn.sin_addr.s_addr));
+ informationMessage(outputInfo, c);*/
+
+ return connFileDescriptor;
+}
+
+void cleanUp()
+{
+ close(server_sfd);
+}
+
+int main()
+{
+ outputInfo = stdout;
+ outputError = stdout;
+
+
+ setUpServer("127.0.0.1", 1100);
+
+ startListening(server_sfd);
+
+ int playersConnected = 0;
+ while(playersConnected < MAX_JUCATORI)
+ {
+ //Accepting connections from players
+ int playerFileDescriptor = acceptConnection(server_sfd);
+
+ echipe[playersConnected / NUMAR_ECHIPE].jucatori[playersConnected % JUCATORI_PER_ECHIPA].sfd = playerFileDescriptor;
+ char c[100];
+ sprintf(c, "%d players connected.\n", playersConnected);
+ informationMessage(outputInfo, c);
+ playersConnected++;
+ }
+
+ informationMessage(outputInfo, "All players connected to the server.\n");
+
+ close(server_sfd);
+
+ return 0;
+}
Added: C/trunk/server/server.h
===================================================================
--- C/trunk/server/server.h (rev 0)
+++ C/trunk/server/server.h 2010-03-10 11:54:31 UTC (rev 18)
@@ -0,0 +1,40 @@
+#ifndef __SERVER_H__
+#define __SERVER_H__
+
+#define MAX_JUCATORI 4
+#define MAX_CARTI 24
+#define CARTI_MANA 6
+#define JUCATORI_PER_ECHIPA 2
+
+/**
+Structura pentru o carte
+valoare - valoare cartii (0,2,3,4,10,11)
+culoare - culoarea (D,V,M,R - Duba, Verde, Mac si Rosu).
+**/
+struct carte {
+ int valoare;
+ char culoare;
+};
+
+/**
+Structura pentru un jucator
+**/
+struct jucator {
+ struct carte carti[CARTI_MANA];
+ int carti_ramase;
+ char nume[20];
+ int sfd; /* socket file descriptor */
+};
+
+/**
+Structura pentru o echipa de 2 jucatori
+**/
+struct echipa {
+ struct jucator jucatori[JUCATORI_PER_ECHIPA];
+ int jucatori_activi;
+ int anunturi;
+ int scor;
+ struct carte carti_luate[MAX_CARTI];
+};
+
+#endif /* __SERVER_H__ */
Added: C/trunk/server/server_dummy.c
===================================================================
--- C/trunk/server/server_dummy.c (rev 0)
+++ C/trunk/server/server_dummy.c 2010-03-10 11:54:31 UTC (rev 18)
@@ -0,0 +1,104 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include "../server.h"
+#include "../protocol.h"
+
+int decode_message(char *message) {
+ int code;
+ if (message[1] <= '9' && message[1] >= '0') {
+ code = atoi(message);
+ strcpy(message, message + 3);
+ }
+ code = atoi(message);
+ strcpy(message, message + 2);
+ printf("Decoded this message:\n");
+ printf("code: %d\n", code);
+ printf("message: %s\n", message);
+ printf("---end---\n");
+ return code;
+}
+
+/** address, port **/
+int main(int argc, char *argv[]) {
+ char ip[16];
+ strcpy(ip, argv[1]); //adresa IP server
+ int port = atoi(argv[2]); //port server
+
+ int socketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (socketFD == -1) {
+ printf("error creating socket\n");
+ exit(1);
+ }
+
+ struct sockaddr_in serverSocket;
+ memset(&serverSocket, 0, sizeof(struct sockaddr_in));
+ serverSocket.sin_family = AF_INET;
+ serverSocket.sin_port = htons(port);
+ if (inet_aton(ip, &serverSocket.sin_addr) == 0) {
+ printf("error in ip address format\n");
+ exit(1);
+ }
+
+ if (bind(socketFD, (const struct sockaddr *) &serverSocket, sizeof(struct sockaddr_in)) == -1) {
+ printf("error binding\n");
+ close(socketFD);
+ exit(1);
+ }
+
+ if (listen(socketFD, 100) == -1) {
+ printf("error listening\n");
+ close(socketFD);
+ exit(1);
+ }
+
+ printf("Server up and running\n");
+
+ for (;;) {
+ struct sockaddr_in remoteSocket;
+ socklen_t socksize = sizeof(struct sockaddr_in);
+ memset(&remoteSocket, 0, sizeof(struct sockaddr_in));
+ int connectionFD = accept(socketFD, (struct sockaddr *) &remoteSocket, &socksize);
+ if (connectionFD < 0) {
+ printf("error accepting connection\n");
+ close(socketFD);
+ exit(1);
+ }
+
+ //printf("Received connection from: %s\n",inet_ntoa(remoteSocket.sin_addr));
+ char message[1024];
+
+ while(players < 4) {
+ memset(message, 0, 1024);
+ read(connectionFD, &message, 1024);
+ printf("%s\n", message);
+ int code = decode_message(message);
+ if (code == JOIN_GAME) {
+ printf("YEAH\n");
+ memset(message, 0, 1024);
+ strcpy(message, "2 ACK");
+ write(connectionFD, &message, strlen(message));
+ }
+
+ memset(message, 0, 1024);
+ read(connectionFD, &message, 1024);
+ printf("%s\n", message);
+ code = decode_message(message);
+ if (code == START_GAME) {
+ printf("YEAH\n");
+ memset(message, 0, 1024);
+ strcpy(message, "2 ACK");
+ write(connectionFD, &message, strlen(message));
+ }
+
+ shutdown(connectionFD, SHUT_RDWR);
+ close(connectionFD);
+ }
+
+ close(socketFD);
+ return 0;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|