2013-05-03 167 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