2013-05-03 201 views
0

我目前正在嘗試使用C語言編寫tftp,但讀取發送的數據包時遇到了一些困難。 以下是我有: 是我送的結構:如何從paquet讀取緩衝區(tftp)

typedef struct { 
short type; 
short block_num; 
char* data; 
} data_t; 

功能(服務器端)至極發送數據包:

if (s = sendto (serverSocket, data, 512 ,0, 
        (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
       { 
        perror("sendto"); 
        exit(1); 
       } 

出於某種原因,S = 0,我不確定它是正確的。

客戶端:

char buffer[512 ]; 
    if ((n = recv(serverSocket, buffer, 512-1,0)) < 0) 
     { 
      perror("recv"); 
      exit(1); 
     } 
    data_t * data = malloc (1024); 
    data->data = malloc(512); 
    create_data(buffer,data) 

和create_data功能:

int create_data(char * buffer, data_t* request) 

{ 

data_t * tmp = (data_t*) buffer; 
request->type = tmp->type; 
request->block_num = tmp->block_num; 
strcpy(request->data, tmp->data); 
return 0; 
} 

不幸的是它不工作,似乎這個問題來自於create_data strcpy的,但我不知道爲什麼。

這裏是ServerSocket的創作(服務器端)

memset((char *) &serv_addr,0, sizeof(serv_addr)); 
serv_addr.sin_family = PF_INET; 
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
serv_addr.sin_port = htons(SERV_PORT); 

/* 
* Ouvrir socket UDP 
*/ 
if ((serverSocket = socket(PF_INET, SOCK_DGRAM, 0)) <0) 
{ 
    perror ("erreur socket"); 
    exit (1); 
} 
ttl=1; 
if (setsockopt(serverSocket, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) <0) 
{ 
    perror ("setsockopt"); 
    exit (1); 
} 
if (bind(serverSocket,(struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0) 
{ 
    perror("servecho: erreur bind\n"); 
    exit(1); 
} 

request = malloc(sizeof(request_t)); 
        .... 

回答

1

的sendto返回發送的字節數,所以如果它返回0代碼,沒有字節發送完畢。

在服務器部分的代碼中,你似乎有一個發送目標作爲服務器地址? (INETADDR_ANY作爲地址)。這可能是故障的原因。該過程應該是讓服務器首先執行recvfrom(綁定後),然後使用sendto響應與recvfrom中收到的相同地址。 這是ServerClient的一個很好的例子。

接收到的數據或要發送的數據是二進制的,你不能使用strcpy,strcpy會停在第一個空字節'\ 0'處,你需要使用memcpy。好的做法:在分配內存data_t * data = malloc (1024);時,我推薦你使用malloc(sizeof(data_t));

+0

感謝您的回答,但與sendto即使不是數據我發送一個字符串它仍然會返回0. – Exia0890 2013-05-03 16:27:10

+0

可以粘貼代碼爲serverSocket創建 – Sudhee 2013-05-03 16:32:19

+0

請查看更新的第一篇文章。 – Exia0890 2013-05-03 16:42:30