• 大小: 4.01 KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2024-12-29
  • 语言: 其他
  • 标签: UDP  C++  

资源简介

语言为C++,在单机上模拟UDP可靠通信,使用选择性重传协议.

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
#include
#pragma comment(lib“wsock32“)
using namespace std;

#define max_seq 15              //设置能发送的最大的序号
#define send_win 8                //设置发送窗口         
char buff[256];                 //存储你要发送的所有数据即
int pos=0;                      //设置内存中已从数据源中读取的位置
SOCKET s;                  //与服务器绑定的SOCKET
SOCKADDR_IN ser;           //与服务器的地址
char send_buf[send_win][256]IP[20]recv_mes[3];
//send_buf为发送窗口中存储的数据IP服务器端的IP存储服务器端反馈的数据
int fromlen=sizeof(sockaddr);  //存储sockaddr地址的长度
int timeout=1000;              //设置超时重发的时间

//初始化
int Inti()
{           
WSADATA wsadata;
WORD rversion=MAKEWORD(20);
int nret=WSAStartup(rversion&wsadata);
if(nret){
return 0;
}
if(wsadata.wVersion!=rversion){
return 0;
}
return 1;
}

//建立连接
int connected()
{            
int nport;
s=socket(AF_INETSOCK_DGRAM0);//创建数据报套接字
if(s==INVALID_SOCKET){
cout<<“套接口创建失败(socket():“< return 0;
}
//设置超时重传
if(setsockopt(sSOL_SOCKETSO_RCVTIMEO(char*)&timeoutsizeof(timeout))==SOCKET_ERROR){
cout<<“设置接收超时失败。(setsockopt():“< closesocket(s);
return 0;
}
cout<<“请输入服务器端的IP地址(连接本地可输127.0.0.1):“< cin>>IP;
cout<<“请输入端口号:“< cin>>nport;                     
//与服务器进行连接
ser.sin_family=AF_INET;
ser.sin_addr.s_addr=inet_addr(IP);
ser.sin_port=nport;

return 1;
}

//请求是否可以发送
int send_request(char send_buf[send_win][256]int max_num)
{
send_buf[0][0]=‘3‘;
send_buf[0][1]=max_num;
send_buf[0][2]=‘\0‘;
while(1){
if(sendto(ssend_buf[0]strlen(send_buf[0])0(LPSOCKADDR)&sersizeof(sockaddr))==SOCKET_ERROR){
cout<<“出错:发送失败(sendto():“< return 0;
}
cout<<“等待IP为“<
if(recvfrom(srecv_messizeof(recv_mes)0(LPSOCKADDR)&ser&fromlen)==SOCKET_ERROR){
cout<<“出错:接收失败(recvfrom():“< return 0;
}
if(recv_mes[0]==‘4‘&&recv_mes[1]==max_num){
cout<<“服务器允许发送数据。开始发送...“< return 1;
}else if(recv_mes[0]==‘4‘&&recv_mes[1]==0){
cout<<“接收方正忙.你稍后再发送数据。“< return -1;
}
}
}

//从数据源buff中读取记录一个单词一个帧设置要发送的数据结构
void change(char send_buf[send_win][256]int sent_num)
{
int num=2i=(sent_num-1)%send_win;
memset(send_buf[i]0sizeof(send_buf));
send_buf[i][0]=‘2‘;
send_buf[i][1]=sent_num;
while(buff[pos]&&(send_buf[i][num++]=buff[pos++])!=‘ ‘);
send_buf[i][num]=‘\0‘;
}

//发送数据
int send_data(char send_buf[send_win][256]int max_recvint &max_sentint max_num)
{
while(max_sent<(max_recv+send_win)&&max_sent ++max_sent;
change(send_bufmax_sent);
cout<<“正在发送第“< if(sendto(ssend_buf[(max_sent-1)%send_win]strlen(send_buf[(max_sent-1)%send_win])0(LPSOCKADDR)&sersizeof(sockad

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5530  2010-01-07 05:38  Client.cpp

     文件       5067  2010-01-07 05:37  Server.cpp

----------- ---------  ---------- -----  ----

                10597                    2


评论

共有 条评论