2013-11-20 5 views
0

Проблема была в получении и обработке пакетов, потому что я использовал для отправки только буфера, а не «saddr» и его «размер» Следовательно, я использовал структуру для объявления всех членов ow вместо буфера поля в write() api мне нужно отправить имя переменной структуры. мне нужно использовать указатель?Передача имени переменной переменной в записи api()

struct fields 
{ 
    unsigned char buffer[1024]; 

    socklen_t saddr_size; 
} data; 
+1

«& data» ** - ** указатель и да, вы должны использовать & data в качестве аргумента функции 'write'. Но в вашем коде переменная 'data' не инициализируется. –

+1

Uhum, который на самом деле не компилируется. Кажется, вы еще не начали использовать структуру 'data' в своем вызове' recvfrom'. –

+0

о, спасибо, сэр. но как его инициализировать? может быть, задавать глупый вопрос, но я не могу понять. – Beginner

ответ

1

Прежде всего, recvfrom возвращает длину сообщения.

n = recvfrom(sock,buffer,1024,0,(struct sockaddr *)&from, &length);  
if (n < 0) error("recvfrom"); 

Здесь length является размер структуры сокета, который вы используете. Это необходимо инициализировать до вызова recvfrom, чтобы ядро ​​узнало, сколько свободного места доступно для возврата адреса сокета.

также обратите внимание, что у (struct sockaddr *)&from будет адрес удаленного сокета, который используется для отправки дейтаграммы.

Теперь при вызове

data_size = recvfrom(sock_raw , buffer , 1024, 0 , &saddr , (socklen_t*)&saddr_size); 
int cont= write(logfile,&data,data_size); 

data_size будет иметь длину сообщения. Но размер структуры data больше, чем размер data_size. поэтому write не может записывать полные данные на номер logfile.

и отметьте комментарий Класа Линдбека. Это то, что вам нужно.

См. Ответ here.

0
#include <sys/types.h> 
#include <sys/socket.h> 
#include <stdio.h> 
#include <unistd.h> 

struct fields 
    { 
     unsigned char buffer[1024]; 
     struct sockaddr saddr; 
     socklen_t saddr_size; 
    } data; 

int main() 
    { 
     int saddr_size; 
     struct fields data; // Note: this variable will hide the global variabledata. 
     struct sockaddr saddr; 
     ssize_t data_size; 
     int sock_raw, logfile=1; 

     // Need to insert code to create raw socket. 

     data_size = recvfrom(sock_raw, data.buffer, 1024, 0, &data.saddr, 
         &data.saddr_size); 
     int cont = write(logfile, &data, sizeof data); 

     return 0; 
    } 
+0

Разве вы не думаете, что возвращаемое значение 'recvfrom' i.e, data_size меньше размера' data'. –

+0

@Raju Вы правы. Я меняюсь, поэтому я пишу фиксированную длину. Это, вероятно, не то, что ему действительно нужно. Ему необходимо перепроектировать протокол (т. Е. Файловую структуру). Я считаю, что это выходит за рамки вопроса. –

+0

, конечно, это не то, что ему нужно сейчас ... но это может привести к потере данных, и он может опубликовать тот же вопрос снова. Как-то ваш код кажется прекрасным. –

Смежные вопросы