Пример работы с сокетами
Файл 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;
}