資源簡介
停止等待協議,用來發送接受不同的文件。用C++語言寫的。

代碼片段和文件信息
//?receiver.cpp?:?定義控制臺應用程序的入口點。
//
#include?“stdafx.h“
#include?
#include?
#include?“../header/ARQ.h“
#include?“../header/Exception.h“
//?服務器端口
#define?SERVER_PORT?2280
#pragma?comment(lib“ws2_32.lib“)//設置link時的lib庫
using?namespace?std;
SOCKET?PrimaryUDP;
char?FileSavePath[MAX_PATH];
void?InitWinSock()
{
WSADATA?wsaData;
if?(WSAStartup(MAKEWORD(2?2)?&wsaData)?!=?0)
{
throw?Exception(“Windows?sockets?2.2?startup?unsuccessful“);
}
else{
printf(“Using?%s?(Status:?%s)\n“
wsaData.szDescription?wsaData.szSystemStatus);
printf(“with?API?versions?%d.%d?to?%d.%d\n\n“
LOBYTE(wsaData.wVersion)?HIBYTE(wsaData.wVersion)
LOBYTE(wsaData.wHighVersion)?HIBYTE(wsaData.wHighVersion));
}
}
void?mksock(int?type)
{
PrimaryUDP?=?socket(AF_INET?type?0);
if?(PrimaryUDP?0)
{
throw?Exception(“create?socket?error“);
}
}
void?BindSock()
{
sockaddr_in?sin;
sin.sin_addr.S_un.S_addr?=?INADDR_ANY;
sin.sin_family?=?AF_INET;
sin.sin_port?=?htons(SERVER_PORT);
if?(bind(PrimaryUDP?(struct?sockaddr*)&sin?sizeof(sin))?0)
throw?Exception(“bind?error“);
}
DWORD?WINAPI?ARecv(LPVOID?lpParam)
{
FILE?*?file?=?NULL;
sockaddr_in?remote;
int?sinlen?=?sizeof(remote);
BSC?bufferbsc;
bsc.header?=?STX;bsc.tail?=?ETX;
memset(bsc.data?0?MAXBSCLENGTH);
int?iread?=?0;
unsigned?long?dwReceived?=?0;
bool?number?=?true;//發送方的數據開始發送時的序號設為0為了判斷是不是第一次一段數據所以這里標為1
while?(true)
{
iread?=?recvfrom(PrimaryUDP(char*)&buffersizeof(buffer)0(sockaddr*)&remote&sinlen);
if?(SOCKET_ERROR?==?iread?||?buffer.header?!=?STX?||?buffer.tail?!=?ETX)
{
// 數據錯誤發送負應答
cout<<“received?a?error?data“< bsc.bcc?=?NAK;bsc.number=false;//number這時沒有實際的意義
sendto(PrimaryUDP(char*)&bscsizeof(bsc)0(sockaddr*)&remotesinlen);
continue;
}
if?(buffer.number?==?number)
{
// 重復收到數據發送應答消息
cout<<“received?a?repeat?data“< bsc.bcc?=?ACK;
bsc.number?=?buffer.number;
sendto(PrimaryUDP(char*)&bscsizeof(bsc)0(sockaddr*)&remotesinlen);
continue;
}
switch(buffer.bcc)
{
case?ENQ:
{
number?=?!number;//準備接收下一段數據
// 文件請求
cout<<“received?a?file?request?messagefilename:“< // 打開文件
if(strcmp((FileSavePath+strlen(FileSavePath)-1)“\\“)!=0)
strcat(FileSavePath“\\“);
strcat(FileSavePathbuffer.data);
if((file?=?fopen(FileSavePath?“ab“))?==?NULL)
{
cout<<“file?open?failed“< return?-1;
}
break;
}
case?SYN:
{
number?=?!number;
// 文字發送中
int?i?=0;
if((i=fwrite(buffer.data?sizeof(char)?sizeof(buffer.data)?file))?<=?0)
{
cout?<“write?failed“?< return?-1;
}
dwReceived?+=?i;
cout<<“write:“< break;
}
case?EOT:
{
number?=?!number;
// 文件發送完畢
cout<<“file?receive
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????52224??2008-02-29?11:31??ARQDemo\ARQDemo.ncb
?????文件???????1418??2008-02-28?12:33??ARQDemo\ARQDemo.sln
????..A..H.?????12288??2008-02-29?11:31??ARQDemo\ARQDemo.suo
?????文件????????667??2009-11-05?14:10??ARQDemo\header\ARQ.h
?????文件????????403??2008-02-14?09:25??ARQDemo\header\Exception.h
?????文件????2171904??2010-04-11?21:27??ARQDemo\receiver\Debug\receiver.bsc
?????文件?????548951??2010-04-11?21:27??ARQDemo\receiver\Debug\receiver.exe
?????文件?????800252??2010-04-11?21:27??ARQDemo\receiver\Debug\receiver.ilk
?????文件?????204147??2010-04-11?21:27??ARQDemo\receiver\Debug\receiver.obj
?????文件????6487648??2010-04-11?21:27??ARQDemo\receiver\Debug\receiver.pch
?????文件????1123328??2010-04-11?21:27??ARQDemo\receiver\Debug\receiver.pdb
?????文件??????????0??2010-04-11?21:27??ARQDemo\receiver\Debug\receiver.sbr
?????文件?????205824??2010-04-11?21:27??ARQDemo\receiver\Debug\vc60.idb
?????文件?????143360??2010-04-11?21:27??ARQDemo\receiver\Debug\vc60.pdb
?????文件????????997??2008-02-28?12:33??ARQDemo\receiver\ReadMe.txt
?????文件???????3912??2010-04-11?21:27??ARQDemo\receiver\receiver.cpp
?????文件???????3429??2009-11-04?18:56??ARQDemo\receiver\receiver.dsp
?????文件????????541??2009-11-04?18:56??ARQDemo\receiver\receiver.dsw
?????文件??????41984??2010-04-11?21:28??ARQDemo\receiver\receiver.ncb
?????文件??????49664??2010-04-11?21:28??ARQDemo\receiver\receiver.opt
?????文件???????1335??2010-04-11?21:27??ARQDemo\receiver\receiver.plg
?????文件???????3958??2008-02-28?12:51??ARQDemo\receiver\receiver.vcproj
?????文件????????212??2008-02-28?12:33??ARQDemo\receiver\stdafx.cpp
?????文件????????195??2008-02-28?12:33??ARQDemo\receiver\stdafx.h
?????文件????2171904??2009-11-14?20:12??ARQDemo\sender\Debug\sender.bsc
?????文件?????548957??2009-11-14?20:12??ARQDemo\sender\Debug\sender.exe
?????文件?????807356??2009-11-14?20:12??ARQDemo\sender\Debug\sender.ilk
?????文件?????206112??2009-11-14?20:12??ARQDemo\sender\Debug\sender.obj
?????文件????6475360??2009-11-05?14:20??ARQDemo\sender\Debug\sender.pch
?????文件????1123328??2009-11-14?20:12??ARQDemo\sender\Debug\sender.pdb
............此處省略22個文件信息
評論
共有 條評論