-
大小: 16.6MB文件類型: .zip金幣: 1下載: 0 次發布日期: 2023-07-31
- 語言: C/C++
- 標簽:
資源簡介
用c++ 的基礎udp API實現了停等協議,在應用層實現了可靠udp傳輸,用MFC編寫界面,帶文檔,可用于計算機網絡課程設計
代碼片段和文件信息
//?ChatServer.cpp:?定義控制臺應用程序的入口點。
//
#include?“stdafx.h“
#define??_WINSOCK_DEPRECATED_NO_WARNINGS
#include?
#include?
#include?
#include?
#pragma?comment(lib“WS2_32.lib“)
const?int?LAZY?=?1200;
const?int?MAX_CLIENT?=?50;//暫時定義最大的客戶端連接數為6
const?int?BUF_LEN?=?512;
const?int?SEND?=?1;
const?int?ACK?=?2;
const?int?CONNECT?=?3;
const?int?CONNECT_ACK?=?4;
const?int?DISCONNECT?=?5;
const?int?DISCONNECT_ACK?=?6;
union?DataPack?{
char?buf[BUF_LEN?+?128];
struct?DataDetail?{
unsigned?int?seq;
int?type;
int?sender;
int?reciver;
char?str[BUF_LEN];
}data;
};
struct?ReciveData?{
DataPack?data;
sockaddr_in?addrClient;
};
char*?encrypt(char*?data);
char*?decrypt(char*?data);
WSADATA?wsaData;//定義結構體變量
SOCKET?nativeSocket;//本地開啟的socket連接
sockaddr_in?addrSrv?addrClient;//創建套接字地址結構變量
int?addrLen?=?sizeof(sockaddr_in);//接收客戶端地址長度
DataPack?buf;
std::queue?sendBuffer;//發送緩存
std::queue?reciveBuffer;//接受緩存
??//對接收緩存的互斥信號量
HANDLE?reciveBufferMutex?=?CreateSemaphore(
NULL??????????//信號量的安全特性
?1????????????//設置信號量的初始計數。可設置零到最大值之間的一個值
?1????????????//設置信號量的最大計數
?NULL?????????//指定信號量對象的名稱
);
HANDLE?sendBufferMutex?=?CreateSemaphore(
NULL??????????//信號量的安全特性
?1????????????//設置信號量的初始計數。可設置零到最大值之間的一個值
?1????????????//設置信號量的最大計數
?NULL?????????//指定信號量對象的名稱
);
HANDLE?sendBufferCount?=?CreateSemaphore(
NULL??????????//信號量的安全特性
?0????????????//設置信號量的初始計數。可設置零到最大值之間的一個值
?INFINITE????????????//設置信號量的最大計數
?NULL?????????//指定信號量對象的名稱
);
HANDLE?reciveBufferCount?=?CreateSemaphore(
NULL??????????//信號量的安全特性
?0????????????//設置信號量的初始計數。可設置零到最大值之間的一個值
?INFINITE????????????//設置信號量的最大計數
?NULL?????????//指定信號量對象的名稱
);
unsigned?int?recordSeq[MAX_CLIENT]?=?{?0?};//從客戶端收到的各個消息序列號
unsigned?int?curSeq?=?0;//當前正在發送的序列號
unsigned?int?curACKSeq?=?0;//當前收到的確認收到的序列號
unsigned?int?userId?=?0;
sockaddr_in?addrClients[MAX_CLIENT];
void?initSocket()?{
::WSAStartup(MAKEWORD(2?0)?&wsaData);//初始化套接字庫
nativeSocket?=?::socket(AF_INET?SOCK_DGRAM?0);//創建UDP套接字
addrSrv.sin_family?=?AF_INET;
addrSrv.sin_port?=?htons(75);
printf(“port?=?%d\n“?addrSrv.sin_port);
addrSrv.sin_addr.S_un.S_addr?=?INADDR_ANY;
::bind(nativeSocket?(sockaddr*)&addrSrv?sizeof(addrSrv));//綁定服務端地址到本地套接字
printf(“UDP服務器已啟動\r\n“);//提示
}
void?closeSocket()?{
::closesocket(nativeSocket);//關閉套接字
::WSACleanup();//關閉套接字庫
}
//發送線程,按序傳送,超時重傳
DWORD?WINAPI?sendThread(LPVOID?pParam)?{
ReciveData?data;?//緩存這個發送數據
while?(true)?{
if?(curSeq?!=?curACKSeq)?{//如果上一個數據還沒被確認
::sendto(nativeSocket?encrypt(data.data.buf)?sizeof(data.data.buf)?0?(sockaddr*)&data.addrClient?sizeof(data.addrClient));//發送這個數據,并緩存
Sleep(LAZY);//超時等待
continue;
}
WaitForSingleobject(sendBufferCount?INFINITE);??????//相當于P操作
if?(!sendBuffer.empty())?{//發送新數據
curSeq++;//發送序號+1
data?=?sendBuffer.front();
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-01-23?23:38??ChatServer\
?????目錄???????????0??2018-01-23?23:38??ChatServer\.vs\
?????目錄???????????0??2018-01-23?23:38??ChatServer\.vs\ChatServer\
?????目錄???????????0??2018-01-23?23:38??ChatServer\.vs\ChatServer\v15\
?????文件???????27136??2018-01-23?23:29??ChatServer\.vs\ChatServer\v15\.suo
?????文件????37539840??2018-01-23?23:29??ChatServer\.vs\ChatServer\v15\Browse.VC.db
?????目錄???????????0??2018-01-23?23:38??ChatServer\.vs\ChatServer\v15\ipch\
?????文件?????3604480??2018-01-23?23:07??ChatServer\.vs\ChatServer\v15\ipch\1c03e232729903aa.ipch
?????文件?????3604480??2018-01-23?23:14??ChatServer\.vs\ChatServer\v15\ipch\6ea0e97a26867c2a.ipch
?????文件?????3670016??2018-01-23?23:03??ChatServer\.vs\ChatServer\v15\ipch\9cc5f382bab7758c.ipch
?????文件?????3604480??2018-01-22?21:27??ChatServer\.vs\ChatServer\v15\ipch\d440f43b4ef4475e.ipch
?????文件?????3670016??2018-01-23?23:14??ChatServer\.vs\ChatServer\v15\ipch\fe66dcd834ddeecc.ipch
?????目錄???????????0??2018-01-23?23:38??ChatServer\ChatServer\
?????文件???????19976??2018-01-23?23:14??ChatServer\ChatServer\ChatServer.cpp
?????文件????????8217??2018-01-22?22:42??ChatServer\ChatServer\ChatServer.vcxproj
?????文件????????1251??2018-01-22?22:42??ChatServer\ChatServer\ChatServer.vcxproj.filters
?????文件?????????322??2018-01-22?21:27??ChatServer\ChatServer\stdafx.cpp
?????文件?????????366??2018-01-22?21:27??ChatServer\ChatServer\stdafx.h
?????文件?????????370??2018-01-22?21:27??ChatServer\ChatServer\targetver.h
?????文件????????1444??2018-01-22?21:27??ChatServer\ChatServer.sln
?????目錄???????????0??2018-01-23?23:39??uuudp\
?????目錄???????????0??2018-01-23?23:39??uuudp\uuuuudp\
?????文件????????6148??2018-01-23?08:54??uuudp\uuuuudp\.DS_Store
?????目錄???????????0??2018-01-23?22:53??uuudp\uuuuudp\res\
?????文件?????????598??2017-12-17?11:46??uuudp\uuuuudp\res\Toolbar.bmp
?????文件????????2994??2017-12-17?11:46??uuudp\uuuuudp\res\Toolbar256.bmp
?????文件???????67646??2018-01-23?22:53??uuudp\uuuuudp\res\uuuuudp.ico
?????文件?????????670??2017-12-17?11:51??uuudp\uuuuudp\res\uuuuudp.rc2
?????文件????????1324??2017-12-17?11:58??uuudp\uuuuudp\resource.h
?????文件?????????224??2017-12-17?11:51??uuudp\uuuuudp\stdafx.cpp
?????文件????????3050??2017-12-17?11:51??uuudp\uuuuudp\stdafx.h
............此處省略12個文件信息
- 上一篇:數據結構課程設計旅游路線
- 下一篇:zw_vc6.0可執行源碼.zip
評論
共有 條評論