服务器回射程序设计.doc
- 文档编号:332136
- 上传时间:2022-10-09
- 格式:DOC
- 页数:11
- 大小:83.50KB
服务器回射程序设计.doc
《服务器回射程序设计.doc》由会员分享,可在线阅读,更多相关《服务器回射程序设计.doc(11页珍藏版)》请在冰豆网上搜索。
网络编程技术实验报告
实验名称
实验四基于数据报套接字的回射程序设计与实验
队别
姓名
学号
实验日期
2015.12.9
实验报告要求:
1.实验目的2.实验要求3.实验环境4.实验作业5.问题及解决
6.思考问题7.实验体会
【实验目的】
1.巩固套接字编程
2.熟悉流式套接字编程
【实验要求】
使用流式套接字编程实现回射程序,具体包括:
1. 客户端:
主动请求建立连接,接收界面输入字符串,发送数据给服务器,接收服务器返回的应答,输出显示。
2. 服务器:
在指定端口上提供服务,接收客户端的发送的回射请求字符串,将接收到的内容回射给客户端,输出显示。
3. 提炼出网络操作的基本功能,构造网络操作类,修改原有程序
【实验环境】
DEVC++
【实验作业】
网络操作类设计:
classCSocketFrame
{
public:
intstart_up();
intclean_up();
intset_address(char*hname,char*sname,structsockaddr_in*sap,char*protocol);
intquit(SOCKETs);
SOCKETtcp_server(ULONGuIP,USHORTuPort);
SOCKETtcp_server(char*hname,char*sname);
SOCKETtcp_client(char*hname,char*sname);
SOCKETtcp_client(ULONGuIP,USHORTuPort);
};
intCSocketFrame:
:
start_up(void)
{
WORDwVersionRequested;
WSADATAwsaData;
intiResult;
wVersionRequested=MAKEWORD(2,2);
iResult=WSAStartup(wVersionRequested,&wsaData);
if(iResult!
=0)
{
printf("WSAStartup调用错误,错误号:
%d\n",WSAGetLastError());
return-1;
}
/*
if(LOBYTE(wsaData.wVersion!
=2||HIBYTE(wsaData.wVersion)!
=2))
{
printf("无法找到可用的WSD版本\n");
WSACleanup();
return-1;
//告诉用户无法找到可用的WSD
}
else
{
printf("WS2.2初始化成功!
\n");
}*/
return0;
}
intCSocketFrame:
:
clean_up(void)
{
intiResult;
iResult=WSACleanup();
if(iResult==SOCKET_ERROR)
{
//WSACleanup()调用失败
printf("WSACleanup调用错误,错误号:
%d\n",WSAGetLastError());
return-1;
}
else
printf("Winsocketdll释放成功!
\n");
return0;
}
intCSocketFrame:
:
set_address(char*hname,char*sname,structsockaddr_in*sap,char*protocol)
{
structservent*sp;
structhostent*hp;
char*endptr;
unsignedshortport;
unsignedlongulAddr=INADDR_NONE;
//将地址结构socketsddr_in初始化为0,并将地址族设为AF_INET
memset(sap,0,sizeof(*sap));
sap->sin_family=AF_INET;
if(hname!
=NULL)
{
//如果hname不为空,转化地址格式
ulAddr=inet_addr(hname);
if(ulAddr==INADDR_NONE||ulAddr==INADDR_ANY)
{
//调用错误,调用gethostbyname获得主机地址
hp=gethostbyname(hname);
if(hp==NULL)
{
printf("未知的主机名,错误号:
%d\n",WSAGetLastError());
return-1;
}
sap->sin_addr=*(structin_addr*)hp->h_addr;
}
else
sap->sin_addr.S_un.S_addr=ulAddr;
}
else
//如果调用者没有指明一个主机名或地址,则设为通配地址
sap->sin_addr.s_addr=htonl(INADDR_ANY);
//尝试转换sname为一个整数
port=(unsignedshort)strtol(sname,&endptr,0);
if(*endptr=='\0')
{
//如果成功转化为网络字节序
sap->sin_port=htons(port);
}
else
{
//如果失败,则假定是一个服务名称,通过getservbyname()函数获得端口号
sp=getservbyname(sname,protocol);
if(sp==NULL)
{
printf("未知服务,错误号:
%d\n",WSAGetLastError());
return-1;
}
sap->sin_port=sp->s_port;
}
return0;
}
intCSocketFrame:
:
quit(SOCKETs)
{
intiResult=0;
iResult=closesocket(s);
if(iResult==SOCKET_ERROR)
{
printf("closesocket调用错误,错误号:
%d\n",WSAGetLastError());
return-1;
}
iResult=clean_up();
returniResult;
}
SOCKETCSocketFrame:
:
tcp_server(char*hname,char*sname)
{
SOCKETListenSocket;
intiResult=0;
sockaddr_inlocal;
constinton=1;
//为服务器的本机地址设置用户输入的地址以及端口号
if(set_address(hname,sname,&local,(char*)"tcp")!
=0)
return-1;
//创建套接字
ListenSocket=socket(AF_INET,SOCK_STREAM,0);
if(ListenSocket==INVALID_SOCKET)
{
printf("socket函数调用错误,错误号:
%d\n",WSAGetLastError());
WSACleanup();
return-1;
}
//绑定服务器地址
iResult=bind(ListenSocket,(structsockaddr*)&local,sizeof(local));
if(iResult==-1)
{
printf("bind函数调用错误!
错误号:
%d\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return-1;
}
//设置函数为监听状态,监听队列长度为NLISTEN
iResult=listen(ListenSocket,SOMAXCONN);
if(iResult==SOCKET_ERROR)
{
printf("Listen函数调用错误!
错误号:
%d\n",WSAGetLastError());
quit(ListenSocket);
return-1;
}
returnListenSocket;
}
SOCKETCSocketFrame:
:
tcp_server(ULONGuIP,USHORTuPort)
{
SOCKETListenSocket=INVALID_SOCKET;
intiResult=0;
sockaddr_inlocal;
constinton=1;
//为服务器的本机地址设置用户输入的地址以及端口号
memset(&local,0,sizeof(local));
local.sin_family=AF_INET;
local.sin_addr.S_un.S_addr=htonl(uIP);
local.sin_port=htons(uPort);
ListenSocket=socket(AF_INET,SOCK_STREAM,0);
if(ListenSocket==INVALID_SOCKET)
{
printf("socket函数调用错误,错误号:
%d\n",WSAGetLastError());
clean_up();
return-1;
}
//绑定服务器地址
iResult=bind(ListenSocket,(structsockaddr*)&local,sizeof(local));
if(iResult==SOCKET_ERROR)
{
printf("bind函数调用错误!
错误号:
%d\n",WSAGetLastError());
quit(ListenSocket);
return-1;
}
//设置函数为监听状态,监听队列长度为NLISTEN
iResult=listen(ListenSocket,SOMAXCONN);
if(iResult==SOCKET_ERROR)
{
printf("Listen函数调用错误!
错误号:
%d\n",WSAGetLastError());
quit(ListenSocket);
return-1;
}
returnListenSocket;
}
SOCKETCSocketFrame:
:
tcp_client(char*hname,char*sname)
{
intiResult=0;
structsock
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 服务器 射程 设计