LINUX.ORG.RU

компилятор дает ошибку undefined reference

 


0

1

Помогите пожалуйста, компилятор дает ошибку

/tmp/ccNa8DhL.o: In function `sig':
server.c:(.text+0x1b): undefined reference to `shm_unlink'
/tmp/ccNa8DhL.o: In function `main':
server.c:(.text+0x33c): undefined reference to `shm_open'
collect2: error: ld returned 1 exit status
компилирую так gcc -lrt server.c

/*
Программа-сервер должна слушать на TCP-порту 8080.
Клиент подключается и вводит одну из двух команд в виде:
count
- получить общее число обработанных клиентов
time
- вывод времени сервера (unix-формат)
*/
#include <time.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define max_kolvo_client 5
#define max_kolvo_byte 256
#define shar_mem "kolvo_clients"

int flag = 1;
int Socket, Bind, Listen;


void sig(int a) // обработка исключения
{
	printf("\n");
	shm_unlink(shar_mem);
	shutdown(Listen, SHUT_RDWR);
	shutdown(Bind, SHUT_RDWR);
	close(Socket);
	exit(0);
}
// время сервера
void nowTime(char s[9])
{
	struct tm *u;
	time_t timer = time(NULL);
	u = localtime(&timer);
	sprintf(s, "%.2d:%.2d:%.2d\n", u->tm_hour, u->tm_min, u->tm_sec);
}
// "работа" сервера
void ServerSon(int cl, int *addr)
{	
	char str[max_kolvo_byte];
	char time[9];
	sprintf(str, "To finish write \"exit\"\n");
	send(cl, str, strlen(str)+1, MSG_DONTROUTE);
	int stop = 1;
	while (stop)
	{
		int kolvo_simvolov = read(cl, str, max_kolvo_byte);
		str[kolvo_simvolov] = '\0';
		if (strcmp(str, "exit\n")==0) stop = 0;
		else if (strcmp(str, "count\n")==0)
		{
			sprintf(str, "Кол-во обработанных клиентов = %d\n", *addr);
			send(cl, str, strlen(str), MSG_DONTROUTE);
		}
		else if (strcmp(str, "time\n")==0) 
		{
			nowTime(time);
			sprintf(str, "%s", time);
			send(cl, str, strlen(str), MSG_DONTROUTE);
		}
		else
		{
			sprintf(str, "Unknow command\n");
			send(cl, str, strlen(str), MSG_DONTROUTE);
		}
	}
	// разрыв соединения
	shutdown(cl, SHUT_RDWR);
	close(cl);
}

int main(int argc, char ** argv)
{
	int shared_memory = shm_open(shar_mem, O_RDWR, 0);
	if (shared_memory == -1) perror("shared_memory");
	int *addr = mmap(0, sizeof(int), PROT_READ || PROT_WRITE, MAP_SHARED, shared_memory, 0);
	if ( addr == (int*)-1 ) perror("mmap");

	printf("Server started\n");
	
	// подготовка сервера
	Socket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
	
	struct sockaddr_in inet;
	inet.sin_family = PF_INET;
	inet.sin_addr.s_addr = htonl(INADDR_ANY);
	inet.sin_port = htons(8080);
	
	int opt = 1;
	if (setsockopt (Socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) == -1) perror("setsockopt");	
	Bind = bind(Socket, (struct sockaddr *) &inet, sizeof(inet));
	if (Bind<0) perror("Bind");
	
	Listen = listen(Socket, max_kolvo_client);
	if (Listen<0) perror("Listen");
		
	signal(SIGINT, sig); // обрабатываем Ctrl^C, что бы закрыть соединение
	
	while (flag)
	{
		// коннект клиентов
		int cl = accept(Socket, NULL, NULL);
		if (cl>0)
		{
			*addr++;
			int k = fork(); // если есть коннект - обрабатываем клиента в отдельной нити
			if (k == 0) ServerSon(cl, addr);
		}		
	}
	return 0;
}