Возможная схема принятия решения о номере порта во время компиляции:
SERVER = server
CLIENT = client
SERVER.c = src/server.c
CLIENT.c = src/client.c
CFLAGS = -std=gnu99 -Wall -Wextra -Werror -pedantic
PORT = 9823
DFLAGS = -DPORT=$(PORT)
CC = gcc
all: build
build: $(CLIENT) $(SERVER)
$(CLIENT): $(CLIENT.c)
$(CC) $(CFLAGS) $(DFLAGS) -o $(CLIENT) $(CLIENT.c)
$(SERVER): $(SERVER.c)
$(CC) $(CFLAGS) $(DFLAGS) -o $(SERVER) $(SERVER.c)
run: $(CLIENT) $(SERVER)
./$(SERVER)
clean:
$(RM) *.o $(CLIENT) $(SERVER)
Код для клиента и сервера содержит такой код, предпочтительно в общем заголовке:
#ifndef PORT
#define PORT 1234
#endif
и ссылается на PORT, где требуется номер порта.
Если это строго решение во время выполнения, то, возможно, вы используете:
SERVER = server
CLIENT = client
SERVER.c = src/server.c
CLIENT.c = src/client.c
CFLAGS = -std=gnu99 -Wall -Wextra -Werror -pedantic
PORT = 9823
CC = gcc
all: build
build: $(CLIENT) $(SERVER)
$(CLIENT): $(CLIENT.c)
$(CC) $(CFLAGS) -o $(CLIENT) $(CLIENT.c)
$(SERVER): $(SERVER.c)
$(CC) $(CFLAGS) -o $(SERVER) $(SERVER.c)
run: $(CLIENT) $(SERVER)
./$(SERVER) -p $(PORT)
clean:
$(RM) *.o $(CLIENT) $(SERVER)
Вы также нужно сказать клиенту подключиться к указанному номеру порта, конечно. У вас все еще должен быть номер порта по умолчанию, который используется как клиентом, так и сервером в каком-то общем заголовке.
Вы можете использовать гибрид этих решений, где вы определяете номер порта по умолчанию в процессе сборки и используете его. в правиле run
тоже.