Я пытаюсь реализовать свое первое клиент-серверное приложение с сокетом AF_UNIX в C.
Я должен соблюдать определенный протокол связи для запросов, отправленных клиентом.Доступны три типа запросов:
1) <command_name> <object_name> <obj_len> \n <obj_data>
2) <command_name> <object_name> \n
3) <command_name> \n
Обратите внимание, что каждый запрос, кроме первого, заканчивается специальным символом \ n, а длина каждого сообщения неизвестна.
У меня нет проблемчитать 2) и 3) потому что я знаю, что сообщение будет заканчиваться на \ n, поэтому мне просто нужно проверить, является ли последний байт, прочитанный в буфере, \ n, если нет, я продолжу читать из сокета и добавлю последующиевызовы в буфер.
Вместо этого для первой операции вышеуказанный метод не работает, потому что символ \ n находится не в конце сообщения, а в произвольной точке буфера.Что я хотел бы сделать, это прочитать (в этом случае), пока я не достигну \ n, затем проанализировать токен obj_len из буфера и выполнить последнее чтение байтов obj_len из сокета, содержащеговсе содержимое obj_data .
Вот код моей функции readLine, которая работает только с 1) и 2) типами сообщений:
char * readLine(int fd){
char * buf=NULL; //here i store the content
char * tmp=calloc(CHUNK,sizeof(char));
if(!tmp)
return NULL;
if(!buf)
return NULL;
buf[0]='\0';
size_t byte_read=-1;
int len=0;
do{
bzero(tmp,CHUNK); //reset tmp for read
byte_read=read(fd,(void *)tmp,CHUNK);
if(byte_read==-1){
perror("read");
if(tmp)free(tmp);
if(buf)free(buf);
return NULL;
}
len=len+byte_read; //update the len of message
buf=realloc(buf,len+1);
if(!buf){
perror("realloc");
if(tmp)free(tmp);
return NULL;
}
buf=strncat(buf,tmp,byte_read);//append each call of read
if(byte_read>0 && buf[byte_read-1]=='\n')
//the last byte read is the special character
break;
}
while(byte_read!=0);
if(byte_read==0)
//read error SIGPIPE
if(tmp)free(tmp);
return buf;
}
Что мне делатьКак вы думаете, для реализации функции, которая читает сообщения, отформатированные как 2), 3) и 1) из сокета?