全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2080
推到 Plurk!
推到 Facebook!

TFTP Function 中的FD_ISSET疑問??

缺席
JammyHuang
一般會員


發表:7
回覆:2
積分:1
註冊:2004-05-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-26 20:40:06 IP:61.59.xxx.xxx 訂閱

這個function可以透過aBindIPAddr(網卡的IP)上傳檔案到指定的aDUT_IP(目的裝置IP).
我目前遇到的問題是我在某些電腦上這個function可以正常work,然而在某些電腦上就無法順利work,
錯誤的地方發生在if (FD_ISSET(sock_in,&readtemp))這一行回傳false,但是到底是為什麼呢??
實在搞不懂,如果說整個程序上有錯,那應該沒有ㄧ台電腦可以work才對...有哪位高手可以幫我看一下
問題出在哪嗎?



int __fastcall DUTX::TFTP_Upload_File(AnsiString aDUT_IP,AnsiString aBindIPAddr,AnsiString aFilePath,AnsiString aPassword)
{
int str_len,count;
int handle,ret,stat,send_size,recv_size;
int pkt_type,pkt_block;
char *opt_mode;
unsigned int opt_val,src_port,dst_port;
unsigned char send_buf[4096],recv_buf[4096],str_buf[512];
unsigned char file_path[128],pw_str[128];
WORD version=MAKEWORD(2,2);
DWORD bytes;
WSADATA wsaData;
SOCKET sock_in,sock_out;
SOCKADDR_IN *nic_addr,bind_addr,dest_addr;
fd_set readtemp;
struct timeval tv;

// Init & Pre-setting parameter
src_port = 69;
dst_port = 69;
opt_mode = "octet";

memset(file_path,0x0,128);
memcpy(file_path,aFilePath.c_str(),aFilePath.Length());
memset(pw_str,0x0,128);
memcpy(pw_str,aPassword.c_str(),aPassword.Length());

// Open Upload File
if ((handle = open(file_path,O_RDONLY | O_BINARY )) == -1) return 1; // Open file error

// Winsock initialize
ret = WSAStartup(version,&wsaData);
if (ret != 0) return 2; // Winsock initialize Error

if (wsaData.wVersion != version)
{
stat = 3; // Winsock version not available
goto STOP_PROCESS;
}

// Create socket input
sock_in = WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
if (sock_in == INVALID_SOCKET)
{
stat = 4; // Can't Create Input Unit Socket
goto STOP_PROCESS;
}

// Create socket output
sock_out = WSASocket(AF_INET,SOCK_RAW,IPPROTO_UDP,NULL,0,WSA_FLAG_OVERLAPPED);
if (sock_out == INVALID_SOCKET)
{
stat = 5; // Can't Create Output Unit Socket
goto STOP_PROCESS;
}

// Define connect info.
bind_addr.sin_family = AF_INET;
bind_addr.sin_addr.s_addr = inet_addr(aBindIPAddr.c_str());;
bind_addr.sin_port = htons(src_port);
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr(aDUT_IP.c_str());
dest_addr.sin_port = htons(dst_port);

// Bind Write Socket Address
ret = bind(sock_in,(SOCKADDR *)&bind_addr,sizeof(bind_addr));
if (ret == SOCKET_ERROR)
{
stat = 6; // Bind Input Unit Socket Address in Localhost Error
goto END_PROCESS;
}

// Bind Read Socket Address
ret = bind(sock_out,(SOCKADDR *)&bind_addr,sizeof(bind_addr));
if (ret == SOCKET_ERROR)
{
stat = 7; // Bind Input Unit Socket Address in Localhost Error
goto END_PROCESS;
}

// Connect Remote Socket Address
ret = connect(sock_out,(SOCKADDR *)&dest_addr,sizeof(dest_addr));
if (ret == SOCKET_ERROR)
{
stat = 8; // Connect Output Unit Socket Error
goto END_PROCESS;
}

// ------ Set promiscous mode ------
opt_val = 1;
ret = WSAIoctl(sock_in,SIO_RCVALL,&opt_val,sizeof(opt_val),NULL,0,&bytes,NULL,NULL);
if (ret == SOCKET_ERROR)
{
stat = 9; // Set Output Unit Socket in Promiscous Mode Error
goto END_PROCESS;
}

// ------ Socket Process Settings ------
pkt_type = 1; // Write Request
pkt_block = 0;
do
{
// Init
count = 0;
memset(send_buf,0,4096);

// TFTP packet process
switch (pkt_type)
{
case 1: // TODO: TFTP Write Request
send_buf[count ] = 0x00;
send_buf[count ] = 0x02;
for (unsigned int i=0;i {
send_buf[count ] = file_path[i];
}
send_buf[count ] = 0x00;
for (unsigned int i=0;i {
send_buf[count ] = opt_mode[i];
}
send_buf[count ] = 0x00;
if ((pw_str != "") || (pw_str != NULL))
{
for (unsigned int i=0;i {
send_buf[count ] = pw_str[i];
}
send_buf[count ] = 0x00;
}
send_buf[count ] = 0x00;
pkt_type = 2;
break;
case 2: // TODO: TFTP Write Data
send_buf[count ] = 0x00; // opcode
send_buf[count ] = 0x03;
send_buf[count ] = pkt_block / 256; // block Number
send_buf[count ] = pkt_block % 256;
str_len = read(handle,str_buf,512);
for (int i=0;i {
send_buf[count ] = str_buf[i];
}
if (str_len < 512) pkt_type = 3; // Last packet < 512 Bytes
}

// ------ Send TFTP Request Packet ------
send_size = sendto(sock_out,send_buf,count,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));
if (send_size != count)
{
stat = 10; // Send TFTP Packet Data Size Error
goto END_PROCESS;
}

// ------ Read response packet information ------
tv.tv_sec = 6; // time out
tv.tv_usec = 0;
while (1)
{
FD_ZERO(&readtemp);
FD_SET(sock_in,&readtemp);
if ((select(sock_in,&readtemp,NULL,NULL,&tv)) == SOCKET_ERROR)
{
stat = 11; // Configure Socket To Select Mode Error
goto END_PROCESS;
}
if (FD_ISSET(sock_in,&readtemp))
{
int data_size,pkt_dst_port;
char pkt_dst_ip[20],pkt_src_ip[20];
unsigned int chksum_num;
unsigned short udp_data[4096];

memset(recv_buf,0,sizeof(recv_buf));
recv_size = recv(sock_in,(char *)recv_buf,sizeof(recv_buf),0);
if (recv_size != 0 || recv_size == -1)
{
// IP Level Filter
memset(pkt_dst_ip,0,sizeof(pkt_dst_ip));
memset(pkt_src_ip,0,sizeof(pkt_src_ip));
sprintf(pkt_dst_ip,"%s.%s.%s.%s",IntToStr(recv_buf[12]),IntToStr(recv_buf[13]),IntToStr(recv_buf[14]),IntToStr(recv_buf[15]));
sprintf(pkt_src_ip,"%s.%s.%s.%s",IntToStr(recv_buf[16]),IntToStr(recv_buf[17]),IntToStr(recv_buf[18]),IntToStr(recv_buf[19]));
if ((strcmp(pkt_dst_ip,aBindIPAddr.c_str())) && (strcmp(pkt_src_ip,aDUT_IP.c_str())))
{
// UDP Type and Port Number Filter
pkt_dst_port = recv_buf[22]*256 recv_buf[23];
if ((recv_buf[9] == 0x11) && (pkt_dst_port == (int)src_port))
{
// Check TFTP Opcode Mode
if ((recv_buf[28] == 0x00) && (recv_buf[29] == 0x05)) // TFTP Error
{
stat = 12; // No Such User in Remote TFTP Services
goto END_PROCESS;
}
if ((recv_buf[28] == 0x00) && (recv_buf[29] == 0x04)) // TFTP ACK
{
dst_port = recv_buf[20]*256 recv_buf[21];
dest_addr.sin_port = htons(dst_port);
stat = 0;
break;
}
}
}
}
}
else
{
stat = 99; // TFTP Server No Response Packet(Time out)
goto END_PROCESS;
}
}
pkt_block ;
} while (pkt_type < 3);

END_PROCESS:
closesocket(sock_in);
closesocket(sock_out);

STOP_PROCESS:
WSACleanup();
close(handle);

return stat;
}

系統時間:2024-04-25 9:24:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!