• 大小: 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个文件信息

评论

共有 条评论

相关资源