Полезные статьи

Статьи по тегам: bash (1) C++ (1) debian (2) linux (7) LVM (1) mediatomb (1) openvpn (1) rj45 (1) ubuntu (2) vpn (1) xen (1) диск (1) заметки (1) настройка (4) обжимка (1) обозначение (1) схема (1) установка (3) учебник (1) шифрование (1)

Проверка C++

Пример работы с сокетами

Файл main.h

#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/socket.h>

#include <unistd.h>

#include <netinet/in.h>

#include <string.h>

#include <stdbool.h>

#include <time.h>

//----------------------------------------------------------------------
//
//	Сообщения
//

#define	APP_MSG_UNKNOWN_COMMAND			0		//	Неизвестная команда
#define APP_MSG_HELP					1		//	Справка
#define APP_MSG_HELPFILE_NOT_FOUND		2		//	Не удалось открыть файл справки

//	
char *msg_array[]={
	"Неизвестная команда\n",				//	0	APP_MSG_UNKNOWN_COMMAND
	"Справка:\n",							//	1	APP_MSG_HELP
	"Не удалось открыть файл справки\n",	//	2	APP_MSG_HELPFILE_NOT_FOUND
};

//----------------------------------------------------------------------
//
//	Объявления функций
//

int app_socket_sendmsg (int socket_id, int msg_id);


//----------------------------------------------------------------------

//	Отправить стандартное сообщение в сокет
int app_socket_sendmsg (int socket_id, int msg_id)
{
	send(socket_id,msg_array[msg_id],strlen(msg_array[msg_id]),0);
	
	return 0;
}

Файл main.c

#include "main.h"

int main (void)
{
	int sock, listener;
	struct sockaddr_in addr;
	char buf[2048];
	int bytes_read;
	
	const char prompt[]=":> ";
	const int app_port=11000;
	
	FILE *fp;
	char s[4096];
	
	bool app_cmd_found=false;
	
	//------------------------------------------
	
	printf("%s","\n\nStarting ...\n\n");
	
    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("ERROR: Failed to create socket\n");
        exit(1);
    }
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(app_port);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("ERROR: Failed to bind with socket\n");
        exit(2);
    }

    listen(listener, 1);
    
    while(1)
    {
        sock = accept(listener, NULL, NULL);
        
        //	
        if(sock < 0)
        {
            perror("ERROR: Failed to accept data\n");
            exit(3);
        }

        while(1)
        {
            app_cmd_found=false;
            
            bytes_read = recv(sock, buf, 1024, 0);
            if(bytes_read <= 0) break;
            
            //	Выводим приглашение
            send(sock,prompt,strlen(prompt),0);
            
            //	Нормальный выход
            if(strncmp(buf,"quit",strlen("quit"))==0)
            {
				app_cmd_found=true;
				
				send(sock,"Выход\n",strlen("Выход\n"),0);
				close(sock);
				
				exit(0);
			}
            
            //	Справка
            if(strncmp(buf,"help",strlen("help"))==0)
            {
				app_cmd_found=true;
				
				fp=fopen("./help.txt","r");
				if(fp==NULL)
				{
					app_socket_sendmsg(sock,APP_MSG_HELPFILE_NOT_FOUND);
				}
				else 
				{
					app_socket_sendmsg(sock,APP_MSG_HELP);
					
					while (fgets(s,100,fp))
					{
						send(sock,s,strlen(s),0);
					}
					fclose(fp);
				}
			}
            
            //	Дата время
            if(strncmp(buf,"date",strlen("date"))==0)
            {
				app_cmd_found=true;
				
				time_t rawtime;
				struct tm * timeinfo;
				
				time(&rawtime);					// текущая дата в секундах
				timeinfo=localtime(&rawtime);
				
				strftime(s,1024,"Дата и время: %d.%m.%y %H:%I:%S\n",timeinfo);
				
				send(sock,s,strlen(s),0);
			}
            
            //	Неизвестная команда
            if(app_cmd_found==false)
            {
				app_socket_sendmsg(sock,APP_MSG_UNKNOWN_COMMAND);
			}
        }
    
        close(sock);
    }
	
    return 0;
}