Создание сервера на С

Транзисторы, резисторы, микросхемы, микроконтроллеры. C/C++, C#, PHP, HTML и пр.

Модератор: KopylovSergey

Ответить
mcu2022
Сообщения: 3
Зарегистрирован: 23 сен 2022, 02:31

Создание сервера на С

Сообщение mcu2022 » 14 янв 2023, 02:55

Доброго времени суток.
Начну новую тему по серверу, у меня необходимость, а кому-то может будет интересно.
Нужен сервер, принимающий определённые данные.

В качестве каркаса взял (пока для ознакомления, т.к. с сокетами и серверами вообще никогда не работал) такой код:

Сервер:

Код: Выделить всё

#include	"unp.h"
#include	<time.h>

int
main(int argc, char **argv)
{
	int					listenfd, connfd;
	struct sockaddr_in	servaddr;
	char				buff[MAXLINE];
	time_t				ticks;

	listenfd = socket(AF_INET, SOCK_STREAM, 0);

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family      = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port        = htons(13);	/* daytime server */

	bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

	listen(listenfd, LISTENQ);

	for ( ; ; ) {
		connfd = accept(listenfd, (SA *) NULL, NULL);

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        write(connfd, buff, strlen(buff));

		close(connfd);
	}
}
Клиент:

Код: Выделить всё

#include	"unp.h"

int
main(int argc, char **argv)
{
	int					sockfd, n;
	char				recvline[MAXLINE + 1];
	struct sockaddr_in	servaddr;

	if (argc != 3)
		//err_quit("usage: a.out <IPaddress>");
		printf("usage: a.out <IPaddress> \n");

	if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		//err_sys("socket error");
		{printf("socket error \n");
		exit (1);}

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port   = htons(atoi(argv[2]));	/* daytime server */
	if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
		//err_quit("inet_pton error for %s", argv[1]);
		printf("inet_pton error for %s\n",argv[1]);

	if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
		//err_sys("connect error");
		{printf("connect error \n");
		exit (2);}

	while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
		recvline[n] = 0;	/* null terminate */
		if (fputs(recvline, stdout) == EOF)
			//err_sys("fputs error");
			{printf("fputs error \n");
		exit (3);}
	}
	if (n < 0)
		//err_sys("read error");
		{printf("read error \n");
		exit (4);}

	exit(0);
}
Результат:
Screenshot_2.jpg
Screenshot_2.jpg (14 КБ) 51 просмотр
daytimetcpsrv.7z
(4.88 КБ) 6 скачиваний
daytimetcpcli.7z
(5.02 КБ) 6 скачиваний
Код клиента немного модифицировал, добавив ему параметр передачи порта, т.к. в примере, серверу почему-то порт назначается рандомно, хотя и прописан жестко. Ещё не разбирался с этой проблемой.

Пы.сы.: ищу единомышленников, буду размещать эту тему на других форумах. Клиентом в дальнейшем будет железяка и данные нужно будет принимать другие.

У меня не хватает времени на изучение вопроса, потому и решил написать в сообществе.

Сразу же отвечу на предполагаемый вопрос: нет, мне никто не платит за это, это больше хобби (пока), но есть планы. Следовательно если рассчитываете сразу заработать, на данном этапе не выйдет.

Для связи: its769545(gav)gmail.com

Ответить