I have a project in c and I cannot compile it because of errors. I use CLion editor and compile it there(using the play button). I get the following error:
CMakeFiles/GameServer.dir/game.c.o: In function `hra':
/home/irina/CLionProjects/GameServer/game.c:59: undefined reference to `broadcast'
/home/irina/CLionProjects/GameServer/game.c:86: undefined reference to `broadcast'
/home/irina/CLionProjects/GameServer/game.c:92: undefined reference to `receive'
/home/irina/CLionProjects/GameServer/game.c:95: undefined reference to `receive'
...
/home/irina/CLionProjects/GameServer/game.c:234: undefined reference to `broadcast'
/home/irina/CLionProjects/GameServer/game.c:249: undefined reference to `broadcast'
/home/irina/CLionProjects/GameServer/game.c:261: undefined reference to `broadcast'
CMakeFiles/GameServer.dir/game.c.o:/home/irina/CLionProjects/GameServer/game.c:275: more undefined references to `broadcast' follow
I don't understand why, I have the functions defined in another file. Here is how my files look:
main.h:
#ifndef SERVER_MAIN_H
#define SERVER_MAIN_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include "structures.h"
#define PORT 10211
#define LOBBYSIZE 3
place lobby[LOBBYSIZE];
void broadcast(int socket, int socket1, char *sbuff);
void receive(int socket, char *buff);
void initializeLobby();
void sendMess(int newSocket, char *sbuff, int lenBuff);
typedef char *str[3];
char parseRecvMess(char *buff);
void addToLobby(player *hrac);
int main();
#endif //SERVER_MAIN_H
and main.c :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/queue.h>
//#include "player.h"
#include "game.h"
#include "main.h"
#include "structures.h"
//#define PORT 10126
//#define LOBBYSIZE 3
//TODO
//send a message to all players
void broadcast(int socket, int socket1, char *sbuff) {
//printf("Broadcast function called\n");
send(socket, sbuff, 256, 0);
send(socket1, sbuff, 256, 0);
}
//recieve message from clients
void receive(int socket, char *buff){
int size = 256;
char *user;
char *command;
int reader = recv(socket, buff, size * sizeof(char), 0);
if (reader == -1) {
printf("BREAK reader == -1\n");
perror("recv()");
exit(0);
} else if (reader == 0) {
printf("BREAK reader == 0\n");
exit(0);
}
// else {
// command = strtok(buff, ":"); //split received message in name and command
// user = command;
// command = strtok(NULL, ":");
// printf("\n%s sent: %s\n", user, command);
// }
}
place lobby[LOBBYSIZE]; //declare lobby
void initializeLobby(){
lobby[0].name = "Mistnost 1";
lobby[0].id = 0;
lobby[0].max_pocet_hracu = 2;
lobby[0].pocet_hracu = 0;
lobby[1].name = "Mistnost 2";
lobby[1].id = 1;
lobby[1].max_pocet_hracu = 2;
lobby[1].pocet_hracu = 0;
lobby[2].name = "Mistnost 3";
lobby[2].id = 2;
lobby[2].max_pocet_hracu = 2;
lobby[2].pocet_hracu = 0;
//
}
void sendMess(int newSocket, char *sbuff, int lenBuff) {
printf("Ve funkci sendMess1\n");
write(newSocket, sbuff, lenBuff);
printf("Ve funkci sendMess2\n");
//bzero(*sbuff,lenBuff);
//sbuff = "";
printf("Ve funkci sendMess3\n");
}
typedef char *str[3]; // char used in addToLobby for converting int -> string
//void clearMistnost(place *m){
// m->pocet_hracu = 0;
// m->player1.gameScore = 0;
// m->player2.gameScore = 0;
//}
char parseRecvMess(char *buff){
char a[2];
char *user;
char *command;
command = strtok(buff, ":"); //split received message in name and command
user = command;
command = strtok(NULL, ":");
a[0] = (char) user;
a[1] = (char) command;
return (char) a;
}
//Add player to lobby
void addToLobby(player *hrac){
int size = 256;
char sbuff[size];
char buff[size];
memset(sbuff, '\0', size);
strcpy(sbuff, "Ahoj " );
strcat(sbuff, hrac->name);
strcat(sbuff, " vitej ve hre. Vyber si mistnost:+");
for( int i = 0; i< LOBBYSIZE; i++) {
strcat(sbuff, lobby[i].name);
strcat(sbuff, ": pocet hracu = ");
str str;// TODO
//itoa(lobby[i].pocet_hracu, str, 10);
sprintf(str, "%d", lobby[i].pocet_hracu);
strcat(sbuff, str);
strcat(sbuff, "+");
}
strcat(sbuff, ":\n");
send(hrac->socket, sbuff, sizeof(sbuff), 0);
bzero(sbuff, size);
int volba = 1000;
while ((volba < 1) || (volba > LOBBYSIZE)) {
receive(hrac->socket, buff);// read the message from client and copy it in buffer
char *command; // sent command
char *user; //user name
command = strtok(buff, ":"); //split received message in name and command
user = command;
command = strtok(NULL, ":");
printf("\n%s sent: %s", user, command);
// volba mistnosti
volba = atoi(command);
if (lobby[volba - 1].pocet_hracu < lobby[volba - 1].max_pocet_hracu) { // hrac se do mistnosti vejde
hrac->mist = &lobby[volba - 1];
if (lobby[volba - 1].pocet_hracu == 0) {
lobby[volba - 1].player1 = *hrac;
} else {
lobby[volba - 1].player2 = *hrac;
}
lobby[volba - 1].pocet_hracu++;
memset(sbuff, '\0', size);
strcpy(sbuff, "Jsi v mistnosti: "); // TODO strncpy
//strncpy()
strcat(sbuff, hrac->mist->name);
strcat(sbuff, "\n");
send(hrac->socket, sbuff, sizeof(sbuff), 0); // TODO kontrolu v metode
//printf("%s si vybral %s\n", hrac->name, hrac->mist->name);
//bzero(sbuff, size);
//printf("Pokus2.");
}
if(hrac->mist->pocet_hracu != 2){
//printf("Cekame na druheho hrace...");
strcpy(sbuff, "Cekame na druheho hrace...\n");
send(hrac->socket, sbuff, sizeof(sbuff), 0);
}
//hra(hrac->mist);
}
}
int main(){
// struct mistnost lobby[3];
initializeLobby();
srand(time(NULL));
//memset(&lobby, '\0', sizeof(lobby));
//fork();
int socketfd, ret;
struct sockaddr_in serverAddr;
int newSocket;
struct sockaddr_in newAddr;
socklen_t addr_size;
//char buffer[1024];
pid_t childpid;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socketfd < 0){
printf("\n error in socket creation");
return -1;
}
printf("\n Server socket is created\n");
memset(&serverAddr, '\0', sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
ret = bind(socketfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if(ret < 0){
printf("Error in binding\n");
return -1;
}
printf("[*]Bind to port %d\n", PORT);
if(listen(socketfd, 10) == 0){
printf("Listening...\n");
}else{
printf("Error in binding\n");
}
int size = 256;
char buff[size];
char sbuff[size];
int n;
int reader;
memset(buff, 0, size);
memset(sbuff, 0, size);
// infinite loop for receiving and sending
for (;;) {
newSocket = accept(socketfd, (struct sockaddr*)&newAddr, &addr_size);
if( newSocket < 0){
printf("No socket\n");
exit(1);
}
// read the message from client and copy it in buffer
reader = recv(newSocket, buff, size * sizeof(char), 0);
if (reader == -1) {
perror("recv()");
break;
} else if (reader == 0) {
break;
} else {
char *command; // sent command
char *user; //user name
command = strtok(buff, ":"); //split received message in name and command
user = command;
command = strtok(NULL, ":" );
printf("\n%s sent: %s", user, command);
if (strncmp(" new", command, 4) == 0) {
player newPlayer;
newPlayer.name = (char *)malloc(sizeof(char)*10); // *login must contain up to 10 characters
strcpy(newPlayer.name, user);
//newPlayer.name = user;
newPlayer.gameScore = 0;
newPlayer.roundScore = 0;
newPlayer.socket = newSocket;
//newPlayer.ans = "";
//newPlayer.mist = null;
//addPlayerToList(&newPlayer); // pridame hrace do seznamu
addToLobby(&newPlayer); // pridame hrace do lobby
printf("Server : %s uspesne prihlasen.\n", newPlayer.name);
//while(1) { \\ TODO
if (newPlayer.mist->pocet_hracu == 2){
printMistnost(newPlayer.mist);
hra(newPlayer.mist);
printf("Konec hry\n");
clearMistnost(newPlayer.mist); // mist.pocet_hracu = 0
addToLobby(&newPlayer.mist->player1);
addToLobby(&newPlayer.mist->player2);
}
//}
}
//TODO playing multiple games in different lobby rooms at te same time
if (strncmp("exit", command, 4) == 0) {
printf("Server Exit...\n");
break;
}
bzero(buff, size);
//n = 0;
printf("To client : OK\n");
strcpy(sbuff, "OK\n" );
// copy server message in the buffer
//while (((sbuff[n++] = getchar()) != '\n'));
// and send that buffer to client
write(newSocket, sbuff, sizeof(sbuff));
//bzero(sbuff, size);
// }
}
if((childpid = fork()) == 0){
close(socketfd);
// while(1){
// printf("MAIN->while(1)\n");
// read(newSocket, buff, size);
// printf("MAIN->while(2)\n");
//
// if(strcmp(buff,":exist") == 0){
// printf("Disconnected from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));
// break;
// } else{
// char *command; // sent command
// char *user; //user name
//
// command = strtok(buff, ":"); //split received message in name and command
// user = command;
// command = strtok(NULL, ":" );
// lobby->player1.ans = command;
// printf("Client: %s\n", buff);
// //scanf("%s", &sbuff[0]);
// //sendMess(newSocket, sbuff, strlen(sbuff));
// strcpy(sbuff, "OK\n" );
// write(newSocket, sbuff, strlen(sbuff));
// bzero(buff, sizeof(buff));
// bzero(sbuff, sizeof(sbuff));
// }
// }
}
}
close(newSocket);
return 0;
}
and the file game.c where I use the function 'broadcast' and 'receive':
//#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#include "game.h"
#include <stdio.h>
void printMistnost(place *m){
printf("Name = %s\n", m->name);
printf("pocet hracu = %d\n", m->pocet_hracu);
printf("Player1: \n");
printf("\tName = %s\n", m->player1.name);
printf("\troundScore = %d\n", m->player1.roundScore);
printf("\tgameScore = %d\n", m->player1.gameScore);
printf("\tsocket = %d\n", m->player1.socket);
printf("Player2: \n");
printf("\tName = %s\n", m->player2.name);
printf("\troundScore = %d\n", m->player2.roundScore);
printf("\tgameScore = %d\n", m->player2.gameScore);
printf("\tsocket = %d\n", m->player2.socket);
}
void clearMistnost(place *m){
m->pocet_hracu = 0;
m->player1.gameScore = 0;
m->player2.gameScore = 0;
}
int hod(){//int *cisla[6]){
printf("Hazim kostkou\n");
int score = 0;
int cislo;
//int cisla[6];
for (int i = 0; i < 6; i++){
cislo = (rand() % 6) + 1;
printf("%d: %d\n",i+1, cislo);
cisla[i] = cislo;
}
printf("\n");
for( int i = 0; i < 3; i++){
if(cisla[i] == 1 ){
return score = 0;
}
score += cisla[i];
}
return score;
}
void hra(place *m){ // pointer
int size = 256;
char sbuff[size];
char buff[size];
int reader;
memset(sbuff, '\0', size);
strcpy(sbuff, "Hra zacina.\t\n");
broadcast(m->player1.socket, m->player2.socket, sbuff);
//printf("Hra zacina...\n");
int vyhra = 20;
//int cisla[6];
int vysledekHodu;
int maxBodu = 0;
int hraje = 1;
char pokracovat;
struct hrac vyherce;
char *command; // sent command
char *user; //user name
str str;
//int player = 1;
while(1) {
vysledekHodu = 0;
for (int i = 0; i < m->pocet_hracu; i++) {
hraje = 1;
printf("Hraje hrac %d\n", i+1);
memset(sbuff, '\0', size);
strcpy(sbuff, "player ");
if( i == 0){
sprintf(str, "%s", m->player1.name);
} else {
sprintf(str, "%s", m->player2.name);
}
strcat(sbuff, str);
strcat(sbuff, "\n");
broadcast(m->player1.socket, m->player2.socket, sbuff);
int pokracuje = 0;
while(hraje) {
//printf("Pred hodem kostgcc main.c game.c player.ckou.\n");
if (pokracuje == 0){
if( i == 0) {
receive(m->player1.socket, buff);
} else {
receive(m->player2.socket, buff);
}
command = strtok(buff, ":"); //split received message in name and command
user = command;
command = strtok(NULL, ":");
printf("\n%s sent: %s\n", user, command);
}
//if (pokracuje){
vysledekHodu = hod();//(int **) &cisla);
//}
sleep(1);
//broadcast results to both players
for(int j =0; j<3; j++) {
memset(sbuff, '\0', size);
strcat(sbuff, "dice ");
sprintf(str, "%d", j+1);
strcat(sbuff, str);
strcat(sbuff, "");
sprintf(str, "%d", cisla[j]);
strcat(sbuff, str);
strcat(sbuff, "\n");
broadcast(m->player1.socket, m->player2.socket, sbuff);
sleep(1);
}
printf("Vysledek hodu = %d\n", vysledekHodu);
//printf("Pred send \n");
memset(sbuff, '\0', size);
strcpy(sbuff, "Vysledek hodu = ");
sprintf(str, "%d", vysledekHodu);
strcat(sbuff, str);
strcat(sbuff, "\n");
broadcast(m->player1.socket, m->player2.socket, sbuff);
if (vysledekHodu > 0) {
if (i == 0) { // hraje prvni hrac
m->player1.roundScore += vysledekHodu;
printf("Hraje hrac: %s\n", m->player1.name);
strcpy(sbuff, "pokracovat dalsim hodem? A-ano , N-ne :\n");
send(m->player1.socket, sbuff, sizeof(sbuff), 0);
//printf("Po send 1. hracu\n");
} else { // hraje druhy hrac
m->player2.roundScore += vysledekHodu;
printf("Hraje hrac: %s\n", m->player2.name);
strcpy(sbuff, "pokracovat dalsim hodem? A-ano, N-ne :\n");
send(m->player2.socket, sbuff, sizeof(sbuff), 0);
//printf("Po send 2. hracu \n");
}
memset(sbuff, '\0', size);
strcpy(sbuff, "roundScore ");
sprintf(str, "%d", i+1);
strcat(sbuff, str);
strcat(sbuff, "");
if ( i == 0) {
sprintf(str, "%d", m->player1.roundScore);
strcat(sbuff, str);
strcat(sbuff, "\n");
} else {
sprintf(str, "%d", m->player2.roundScore);
strcat(sbuff, str);
strcat(sbuff, "\n");
}
broadcast(m->player1.socket, m->player2.socket, sbuff);
memset(sbuff, '\0', size);
printf("Pokracovat dalsim hodem? \n");
memset(buff, '\0', size);
//Receive message
if (i == 0) { //pokud hraje 1. hrac
//printf("CONTROL RCV 1.hrac\n");
receive(m->player1.socket, buff);
command = strtok(buff, ":"); //split received message in name and command
user = command;
command = strtok(NULL, ":");
printf("\n%s sent: %s\n", user, command);
if (strncmp(" A", command, 2) == 0){
memset(sbuff, '\0', size);
strcpy(sbuff, "Protihrac pokracuje...\n");
send(m->player2.socket, sbuff, sizeof(sbuff), 0);
pokracuje = 1;
}
//m->player1.ans = command;
//printf("player1 ans = '%s'\n", m->player1.ans);
}else { //pokud hraje 2. hrac
//printf("CONTROL RCV 2.hrac\n");
receive(m->player2.socket, buff);
//printf("2CONTROL RCV 2. hrac \n");
command = strtok(buff, ":"); //split received message in name and command
user = command;
command = strtok(NULL, ":");
printf("\n%s sent: %s\n", user, command);
if (strncmp(" A", command, 2) == 0){
memset(sbuff, '\0', size);
strcpy(sbuff, "Protihrac pokracuje...\n");
send(m->player1.socket, sbuff, sizeof(sbuff), 0);
}
}
//Kontrola odpovedi na otazku jestli chce pokracovat
printf("Pred controlou rcv + %s\n", command);
if (strncmp(" A", command, 2) == 0) {
hraje = 1;
} else { // hrac konci svoje kolo
hraje = 0;
if (i == 0) { // hraje prvni hrac
m->player1.gameScore += m->player1.roundScore;
m->player1.roundScore = 0;
memset(sbuff, '\0', size);
strcpy(sbuff, "gameScore1 ");
sprintf(str, "%d", m->player1.gameScore);
strcat(sbuff, str);
broadcast(m->player1.socket, m->player2.socket, sbuff);
memset(sbuff, '\0', size);
} else { // hraje druhy hrac
m->player2.gameScore += m->player2.roundScore;
m->player2.roundScore = 0;
memset(sbuff, '\0', size);
strcpy(sbuff, "gameScore2 ");
sprintf(str, "%d", m->player2.gameScore);
strcat(sbuff, str);
broadcast(m->player1.socket, m->player2.socket, sbuff);
memset(sbuff, '\0', size);
}
}
} else {
hraje = 0;
}
}
memset(sbuff, '\0', size);
strcpy(sbuff, "Celkovy pocet hodu hrace 1 = ");
sprintf(str, "%d", m->player1.gameScore);
strcat(sbuff, str);
strcat(sbuff, "\n");
strcat(sbuff, "Celkovy pocet hodu hrace 2 = ");
sprintf(str, "%d", m->player2.gameScore);
strcat(sbuff, str);
strcat(sbuff, "\n");
broadcast(m->player1.socket, m->player2.socket, sbuff);
//send(m->player1.socket, sbuff, sizeof(sbuff), 0);
//send(m->player2.socket, sbuff, sizeof(sbuff), 0);
memset(sbuff, '\0', size);
}
printf("control if smbd won--------------------------------------------------------------\n");
if ((m->player1.gameScore >= vyhra) || (m->player2.gameScore >= vyhra)) { // nektery hrac jiz vyhral // TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
printf("!!!!!!!!!!!!!!!!!smbd won!!!!!!!!!!!!!!!!!!!\n");
if (m->player1.gameScore == m->player2.gameScore) { // remiza
printf("Remiza: pocet bodu = %d", m->player1.gameScore);
memset(sbuff, '\0', size);
strcpy(sbuff, "Vysledek hry: Remiza. Pocet bodu= ");
sprintf(str, "%d", m->player1.gameScore);
strcat(sbuff, str);
strcat(sbuff, "\n");
broadcast(m->player1.socket, m->player2.socket, sbuff);
//send(m->player1.socket, sbuff, sizeof(sbuff), 0);
//send(m->player2.socket, sbuff, sizeof(sbuff), 0);
} else if (m->player1.gameScore > m->player2.gameScore) { // vyhral prvni hrac
printf("Vyhral hrac %s a ma %d bodu.", m->player1.name, m->player1.gameScore);
memset(sbuff, '\0', size);
strcpy(sbuff, "Vyhral hrac ");
strcat(sbuff, m->player1.name );
strcat(sbuff, ". Pocet bodu: " );
sprintf(str, "%d", m->player1.gameScore);
strcat(sbuff, str);
strcat(sbuff, "\n");
broadcast(m->player1.socket, m->player2.socket, sbuff);
//send(m->player1.socket, sbuff, sizeof(sbuff), 0);
//send(m->player2.socket, sbuff, sizeof(sbuff), 0);
} else { // vyhral druhy hrac
printf("Vyhral hrac %s a ma %d bodu.", m->player2.name, m->player2.gameScore);
memset(sbuff, '\0', size);
strcpy(sbuff, "Vyhral hrac ");
strcat(sbuff, m->player2.name );
strcat(sbuff, ". Pocet bodu: " );
sprintf(str, "%d", m->player2.gameScore);
strcat(sbuff, str);
strcat(sbuff, "\n");
//send(m->player1.socket, sbuff, sizeof(sbuff), 0);
//send(m->player2.socket, sbuff, sizeof(sbuff), 0);
broadcast(m->player1.socket, m->player2.socket, sbuff);
}
return;
}
}
exit(0);
}