如何从paquet读取缓冲区(tftp)

时间:2013-05-03 15:50:00

标签: c sockets buffer packet tftp

我目前正在尝试在C中写一个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 个答案:

答案 0 :(得分:1)

sendto返回发送的字节数,因此如果返回0,则不发送任何字节。

在代码的服务器部分,您似乎有一个目的地作为服务器地址的sendto? (以INETADDR_ANY作为地址)。这可能是出现故障的原因。该过程应该是让服务器首先执行recvfrom(在绑定之后),然后使用sendto回复到recvfrom中收到的同一地址。 以下是ServerClient的一个很好的示例。

接收的数据或要发送的数据是二进制的,你不能使用strcpy,strcpy会停在第一个空字节'\ 0',你需要使用memcpy。

良好做法:在分配内存data_t * data = malloc (1024);时,我建议您使用malloc(sizeof(data_t));