基于WinSock的简单TCP网络编程实验报告Word文档格式.docx
- 文档编号:22281086
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:18
- 大小:235.88KB
基于WinSock的简单TCP网络编程实验报告Word文档格式.docx
《基于WinSock的简单TCP网络编程实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于WinSock的简单TCP网络编程实验报告Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
//Server的UDP端口
constcharSTART_CMD[]="
START"
;
constcharGETCURTIME_CMD[]="
GETCURTIME"
//传递给TCP线程的结构化参数
structTcpThreadParam
{
SOCKETsocket;
sockaddr_inaddr;
};
DWORDWINAPITcpServeThread(LPVOIDlpParam);
//TCP线程的线程函数
DWORDWINAPIUdpServer(LPVOIDlpParam);
//UDP服务器线程
server.cpp
#include"
stdafx.h"
iostream.h"
stdio.h"
string.h"
time.h"
WinSock2.h"
Windows.h"
server.h"
#pragmacomment(lib,"
Ws2_32.lib"
)
#pragmapack
(1)//结构在存储时按字节对齐
longTcpClientCount=0;
intmain(intargc,char*argv[])
////检查命令行参数
//if(argc!
=2)
//{
//cerr<
<
"
Worngformat!
\nCorrectusage:
Server.exe<
TCPserverport>
"
//return-1;
//}
//初始化winsock2环境
WSADATAwsa;
if(WSAStartup(MAKEWORD(2,2),&
wsa)!
=0)
{
cerr<
\nFailedtoinitializethewinsock2stack\n"
<
errorcode:
<
WSAGetLastError()<
endl;
return-1;
}
//创建UDP服务器
DWORDdwThreadId;
CreateThread(NULL,0,UdpServer,NULL,0,&
dwThreadId);
//创建用于侦听的TCPServerSocket
SOCKETListenSocket=socket(AF_INET,SOCK_STREAM,0);
//获取TCP监听端口号
u_shortListenPort=(u_short)atoi(argv[1]);
//获取本机名
charhostname[256];
gethostname(hostname,sizeof(hostname));
//获取本地IP地址
hostent*pHostent=gethostbyname(hostname);
//填充本地TCPSocket地址结构
SOCKADDR_INListenAddr;
memset(&
ListenAddr,0,sizeof(SOCKADDR_IN));
ListenAddr.sin_family=AF_INET;
ListenAddr.sin_port=htons(ListenPort);
ListenAddr.sin_addr=*(in_addr*)pHostent->
h_addr_list[0];
//绑定TCP端口
if(bind(ListenSocket,(sockaddr*)&
ListenAddr,sizeof(ListenAddr))==SOCKET_ERROR)
\nFailedtobindtheListenSocket\n"
//监听
if((listen(ListenSocket,SOMAXCONN))==SOCKET_ERROR)
\nFailedtolistentheListenSocket\n"
cout<
TCPServerStartedOnTCPPort:
ListenPort<
endl<
SOCKETTcpSocket;
SOCKADDR_INTcpClientAddr;
while(TRUE)
//接受客户端连接请求
intiSockAddrLen=sizeof(sockaddr);
if((TcpSocket=accept(ListenSocket,(sockaddr*)&
TcpClientAddr,&
iSockAddrLen))==SOCKET_ERROR)
{
cerr<
\nFailedtoaccepttheclientTCPSocket\n"
<
return-1;
}
//TCP线程数达到上限,停止接受新的Client
if(TcpClientCount>
=MAX_CLIENT)
{
closesocket(TcpSocket);
cout<
ConnectionfromTCPclient"
inet_ntoa(TcpClientAddr.sin_addr)<
:
ntohs(TcpClientAddr.sin_port)<
refusedformaxclientnum\n"
continue;
cout<
accepted\n"
TcpThreadParamParam;
Param.socket=TcpSocket;
Param.addr=TcpClientAddr;
//创建TCP服务线程
DWORDdwThreadId;
CreateThread(NULL,0,TcpServeThread,&
Param,0,&
InterlockedIncrement(&
TcpClientCount);
CurrentNumberofTCPClients:
TcpClientCount<
'
\n'
closesocket(ListenSocket);
WSACleanup();
return0;
}
//TCP服务线程
DWORDWINAPITcpServeThread(LPVOIDlpParam)
charServerTCPBuf[MAX_BUF_SIZE];
//获取线程参数
SOCKETTcpSocket=((TcpThreadParam*)lpParam)->
socket;
SOCKADDR_INTcpClientAddr=((TcpThreadParam*)lpParam)->
addr;
//输出提示信息
cout<
Thread:
GetCurrentThreadId()<
isservingclientfrom"
//发送端口号+"
sprintf(ServerTCPBuf,"
%5d%s"
UDPSrvPort,START_CMD);
send(TcpSocket,ServerTCPBuf,strlen(ServerTCPBuf),0);
WaitingforcommandfromClient(s)..."
intTCPBytesReceived;
time_tCurSysTime;
//读取client发来的请求命令:
memset(ServerTCPBuf,'
\0'
sizeof(ServerTCPBuf));
TCPBytesReceived=recv(TcpSocket,ServerTCPBuf,sizeof(ServerTCPBuf),0);
//TCPBytesReceived值为0表示client端已正常关闭连接
//TCPBytesRecieved值为SOCKET_ERROR则表示socket的状态不正常,无法继续数据通讯
//两种情况下都表明本线程的任务已结束,需要退出
if(TCPBytesReceived==0||TCPBytesReceived==SOCKET_ERROR)
Clientfrom"
disconnected.Thread:
isending"
break;
//检查收到的字符串是否为命令:
if(strcmp(ServerTCPBuf,GETCURTIME_CMD)!
UnknowmcommandfromClient"
RequestforCurrenttimefromclient"
byTCP"
//获取系统时间并发送给client
time(&
CurSysTime);
strftime(ServerTCPBuf,sizeof(ServerTCPBuf),"
%Y-%m-%d%H:
%M:
%S"
localtime(&
CurSysTime));
send(TcpSocket,ServerTCPBuf,strlen(ServerTCPBuf),0);
ServerCurrentTime:
ServerTCPBuf<
InterlockedDecrement(&
closesocket(TcpSocket);
//UDP服务器线程
DWORDWINAPIUdpServer(LPVOIDlpParam)
{
charServerUDPBuf[MAX_BUF_SIZE];
//UDPBuffer
SOCKADDR_INUDPClientAddr;
//存储Client的地址信息
//创建UDPserversocket
SOCKETUDPSrvSocket=socket(AF_INET,SOCK_DGRAM,0);
//填充本地UDPSocket地址结构
SOCKADDR_INUDPSrvAddr;
UDPSrvAddr,0,sizeof(SOCKADDR_IN));
UDPSrvAddr.sin_family=AF_INET;
UDPSrvAddr.sin_port=htons(UDPSrvPort);
UDPSrvAddr.sin_addr=*(in_addr*)pHostent->
//绑定UDP端口
if(bind(UDPSrvSocket,(sockaddr*)&
UDPSrvAddr,sizeof(UDPSrvAddr))==SOCKET_ERROR)
bind()failedforUDPSrvSocket\n"
UDPServerStartedOnUDPPort:
UDPSrvPort<
memset(ServerUDPBuf,'
sizeof(ServerUDPBuf));
//接收UDP请求
if((recvfrom(UDPSrvSocket,ServerUDPBuf,sizeof(ServerUDPBuf),0,(sockaddr*)&
UDPClientAddr,&
recvfrom()failedforUDPSrvSocket\n"
ClientCommand:
Echo\n\n"
\"
ServerUDPBuf<
receivedfrom"
inet_ntoa(UDPClientAddr.sin_addr)<
ntohs(UDPClientAddr.sin_port)<
byUDP"
//ECHO
iSockAddrLen=sizeof(sockaddr);
if((sendto(UDPSrvSocket,ServerUDPBuf,strlen(ServerUDPBuf),0,(sockaddr*)&
UDPClientAddr,iSockAddrLen))==SOCKET_ERROR)
sendto()failedforUDPSrvSocket\n"
Echo"
ServerUDPBuf<
toclinet"
ntohs(UDPClientAddr.sin_port)<
client.exe
iostream.h"
#pragmacomment(lib,"
#defineMAX_BUF_SIZE65535
charClientBuf[MAX_BUF_SIZE];
//输出用户选择界面
voidUserPrompt()
InputthecorrespondingNumtoselectwhatyouwanttheprogramtodo"
endl
<
\t1.Getcurrenttime(TCP)"
\t2.EchoMode(UDP)"
\t3.Exittheprogram"
EnterYourchoice:
unsignedshortServerUDPPort;
SOCKETcTCPSocket,cUDPSocket;
WSADATAwsadata;
SOCKADDR_INTCPServer,UDPServer,RecvFrom;
intRecvFromLength=sizeof(RecvFrom);
charUserChoice;
charportnum[5];
unsignedlongBytesReceived,BytesSent;
intRetValue;
//检查命令行参数
if(argc!
=3)
cout<
endl<
Correctusage:
Client.exe<
TCPServerIP>
TCPServerPort>
endl;
return1;
u_longServerIP=inet_addr(argv[1]);
u_shortServerTCPPort=(u_short)atoi(argv[2]);
//初始化winsock库
if((RetValue=WSAStartup(MAKEWORD(2,2),&
wsadata))!
=0)
printf("
WSAStartup()failedwitherror%d\n"
RetValue);
return2;
//创建TCPSocket
if((cTCPSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
WSASocket()forcTCPSocketfailedwitherror%d\n"
WSAGetLastError());
return3;
//创建UDPSocket
if((cUDPSocket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
WSASocket()forcUDPSocketfailedwitherror%d\n"
return4;
TCPServer.sin_family=AF_INET;
TCPServer.sin_port=htons(ServerTCPPort);
TCPServer.sin_addr.S_un.S_addr=ServerIP;
//通过TCPSocket连接server
if((RetValue=WSAConnect(cTCPSocket,(sockaddr*)&
TCPServer,sizeof(TCPServer),NULL,NULL,NULL,NULL))==SOCKET_ERROR)
WSAConnect()failedforcTCPSocketwitherror%d\n"
WSAGetLastError());
Can'
tconnecttoserver.\n"
);
return5;
//与server建立连接后读取Server发送过来的ServerUDP端口和"
BytesReceived=recv(cTCPSocket,ClientBuf,sizeof(ClientBuf),0);
if(BytesReceived==0||BytesReceived==SOCKET
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 WinSock 简单 TCP 网络 编程 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)