我目前正在嘗試使用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));
....
感謝您的回答,但與sendto即使不是數據我發送一個字符串它仍然會返回0. – Exia0890 2013-05-03 16:27:10
可以粘貼代碼爲serverSocket創建 – Sudhee 2013-05-03 16:32:19
請查看更新的第一篇文章。 – Exia0890 2013-05-03 16:42:30