?? port.cpp
字號:
#include <dos.h>
#include "stdlib.h"
#include "stdio.h"
#define PORT 0
/*函數聲明*/
void SendFile(char *fname); /* 發送文件*/
void Send(int s); /*發送一個字節*/
void SendFileName(char *fname); /*發送文件名*/
void ReceiveFile(); /*接收文件*/
void GetFileName(char *f); /*接收文件名*/
void InitPort(int port,unsigned char para); /*初始化端口*/
void SendPort(int port,char c); /*端口發送*/
int ReadPort(int port); /*讀端口字節*/
int CheckState(int port); /*檢查端口狀態*/
int Receive(int port,int * G); /*接收一個字節*/
/*主函數*/
void main(int argc ,char *argv[] )
{
if(argc<2){
printf("Please input R(receive) or S(sent) parametre:");
exit(1);
}
InitPort(PORT,231);/* 初始化連接端口的參數*/
if(argv[1]=="S") /*檢查選擇的有效性*/
SendFile(argv[2]);/*通過建立的接口發送文件*/
else if(argv[1]=="R")
ReceiveFile();/*接收端負責文件的接收*/
else{
printf("Error parament.Please input again.");
exit(1);
}
}
void SendFile(char *fname )
{
FILE *fp;
int ch,s;
if(!(fp=fopen(fname,"rb"))){/*打開要發送的文件*/
printf("Can't open the file.\n");
exit(1);
}
SendFileName(fname); /*發送將要進行傳輸的文件的文件名*/
do{/*逐字節發送*/
ch=(int)getc(fp);/*得到發送文件的一個字節*/
if(ferror(fp)){
printf("Error reading file.\n");
break;
}
s=ch%16; /*取文件中一個字節的低4位*/
Send(s);/*發送一個字節的低4位*/
s=ch/16; /*取文件中一個字節的高4位*/
Send(s); /*發送一個字節的高4位*/
}while(!feof(fp));/*發送結束*/
s=46; /*發送文件結束信息*/
Send(s);
Send(s);
fclose(fp);
}
void Send(int s )
{
int G;
SendPort(PORT,s);/*發送將要建立連接的端口號*/
G=ReadPort(PORT); /*等待握手信號*/
if(s!=G)
s=s+16;
do{
SendPort(PORT,s); /*發送將要建立連接的端口號*/
G=ReadPort(PORT); /*等待握手信號*/
}while(s!=G);
}
void SendFileName(char *fname )
{
int s,ch;
printf("Now transmit the file.Please wait...");
while(*fname){/*逐字節傳送要發送文件的文件名*/
ch=(int)fname++;
s=ch%16; /*取文件名中一個字節的低4位*/
Send(s);
s=ch/16;
Send(s); /*取文件名中一個字節的低4位*/
}
s=32; /*發送文件名結束標志*/
Send(s);
Send(s);
}
void ReceiveFile(){
FILE *fp;
char ch;
int G1,G2,G3;
char fname[15];
GetFileName(fname);/* 獲得發送文件的文件名*/
printf("Receiving file %s.\n",fname);
remove(fname);
if(!(fp=fopen(fname,"wb"))){/*打開文件準備接受數據*/
printf("Can't open output file.\n");
exit(1);
}
/*循環為檢測每次接受的數據是否為新數據,如果不是,則用此次接收的數據覆蓋上次接收的數據*/
G1=ReadPort(PORT); /*讀取連接端口的信息*/
G2=Receive(PORT,&G1);/* 建立連接后,接收端接收一個字節*/
do{
G3=Receive(PORT,&G2);/* 建立連接后,接收端接收一個字節*/
ch=(char)(G1%16+G2*16); /*恢復分開的數據,組合高4位和低4位*/
putc(ch,fp);/*寫入文件一個字節*/
if(ferror(fp)){
printf("\nError writing file.");
exit(1);
}
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!=48);
printf("\nTransmit finished.");
fclose(fp);/*關閉文件*/
}
int Receive(int port,int *G)
{
int GM;
SendPort(port,*G);/* 發送將要建立連接的端口號*/
GM=ReadPort(port); /*讀取連接端口的信息*/
if(GM/16==0)
return GM;
else if(GM/16==1){
do{
*G=GM;
SendPort(port,GM);
GM=ReadPort(port);
}while(GM/16==1);
}
return GM;
}
void GetFileName(char * f)
{
int G1,G2,G3;
char ch;
G1=ReadPort(PORT);
G2=ReadPort(PORT);
do{
G3=Receive(PORT,&G3);
ch=(char)(G1%16+G2/16);
*f=ch;
*f++;
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!=32);
printf("File name transmit finished.\n");
}
void InitPort(int port,unsigned char para)
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=0;
reg.h.al=para;
int86(0x14,®,®);
}
void SendPort(int port,char c)
{
union REGS reg;
reg.x.dx=port;
reg.h.al=c;
reg.h.ah=1;
int86(0x14,®,®);
if(reg.h.ah&128){
printf("\nSend mistakes!");
exit(1);
}
}
int ReadPort(int port )
{
union REGS reg;
while(!(CheckState(port)&256)){/*檢查端口狀態*/
if(kbhit()){ /*如端口長期無數據可人為終止等待*/
printf("Press any key to exit.");
getch();
exit(1);
}
}
reg.x.dx=port;
reg.h.ah=2;
int86(0x14,®,®);
if(reg.h.ah&128){
printf("\nRead mistake!");
exit(1);
}
return reg.h.al;
}
int CheckState(int port )
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=3;
int86(0x14,®,®);
return reg.x.ax;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -