int sck;//套接字變量
struct sockaddr_in serv_adr; //遠程主機的地址
struct hostent *host; //指向遠程主機的指針
unsigned char databuf[FILEBUF_SIZE]; //數據
int bytes = 0, bytesread = 0; //字節數,讀取到的字節數
host = gethostbyname(server); //根據遠程主機的主機名,得到指向遠程主機的指針
if (host == (struct hostent *) NULL) { //如果得到指向遠程主機的指針失敗,報告錯誤,並返回
perror("gethostbyname failed");
return 0;
}memset(&serv_adr, 0, sizeof(serv_adr)); //初始化遠程主機的地址,結構體內所有成員清零
serv_adr.sin_family = AF_INET; //設置地址類型
memcpy(&serv_adr.sin_addr, host->h_addr, host->h_length);//取出指向遠程主機的指針中包含的地址信息,賦給遠程主機地址變量
serv_adr.sin_port = htons(SERVICE_PORT);//設置端口號,比如http服務對應80端口,ftp對應21端口
if ((sck = socket(AF_INET, SOCK_STREAM, 0)) < 0) { //如果建立TCP協議的套接字失敗,報告錯誤,並返回
perror("error on socket()");
return 0;
}
if (connect(sck, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) < 0) {//如果使用該套接字連接到遠程主機失敗,報告錯誤,並返回
perror("error on connect()");
return 0;
}write(sck, "DI\n\n", 4); //連接成功,發送內容為"DI\n\n"的消息,遠程主機收到該消息,解析後生成目錄列表,並將目錄列表信息傳遞回來
printf("Remote directory listing:\n");//輸出提示信息“遠程主機正在生成目錄列表”
while ((bytes = read(sck, databuf, FILEBUF_SIZE)) > 0) { //從套接字的數據流中讀取遠程主機的返回信息(即目錄列表),每次讀取FILEBUF_SIZE個字節,直到全部讀取完畢
write(fileno(stdout), databuf, bytes);//將每次讀到的數據,輸出到標準輸出流(stdout),即屏幕上
bytesread += bytes;//接收到的字節數累加
}
close(sck); /* Close the socket */ //通信完成,關閉套接字,關閉連接
return bytesread; //返回讀取到的字節數(即遠程主機返回的信息的大小)
}