《并发套接字编程》课程设计报告Word文档下载推荐.doc
- 文档编号:14563295
- 上传时间:2022-10-23
- 格式:DOC
- 页数:10
- 大小:543KB
《并发套接字编程》课程设计报告Word文档下载推荐.doc
《《并发套接字编程》课程设计报告Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《《并发套接字编程》课程设计报告Word文档下载推荐.doc(10页珍藏版)》请在冰豆网上搜索。
编程工具及集成开发环境:
VC++
(二)实验目的和要求
实验目的:
掌握Linux或Windows平台上多线程、多进程或异步I/O的套接字编程。
实验要求:
(1)在Windows上,编写、编译1个客户机端程序和1个服务器端程序。
要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。
(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机端程序可执行文件。
可选内容:
(1)编写Linux或Windows平台上采取各并发方式的1种程序。
(2)测试多线程、多进程或异步I/O的性能。
二、设计方案
本实验采用的多线程的编程方式实现了并发
u各个函数功能:
DWORDWINAPIClientThread(LPVOIDlpParameter)接收每个客户端连接的处理函数
hThread=CreateThread(NULL,0,ClientThread,(LPVOID)CientSocket,0,NULL);
创建进程
send(CientSocket,tmp,(int)strlen(tmp),0);
发送数据
recv(CientSocket,RecvBuffer,MAX_PATH,0);
接收数据
WSAStartup(MAKEWORD(2,2),&
Ws)初始化套接字类库
socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
创建套接字
bind(ServerSocket,(structsockaddr*)&
LocalAddr,sizeof(LocalAddr));
绑定套接字
listen(ServerSocket,10);
侦听,队列大小为10
u设计思想:
创建TCP并发服务器
三、详细设计
服务器:
详细代码:
//multhreadServer.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"
stdafx.h"
#include<
iostream>
Windows.h>
#pragmacomment(lib,"
ws2_32.lib"
)
usingnamespacestd;
winsock2.h>
time.h>
#definePORT4000
#defineIP_ADDRESS"
127.0.0.1"
DWORDWINAPIClientThread(LPVOIDlpParameter)//接收每个客户端连接的处理函数
{
SOCKETCientSocket=(SOCKET)lpParameter;
intRet=0;
charRecvBuffer[MAX_PATH];
//在VC++6.0中,MAX_PATH的值为260。
time_tt=time(0);
chartmp[64];
strftime(tmp,sizeof(tmp),"
%Y/%m/%d%X%A本年第%j天%z"
localtime(&
t));
Ret=send(CientSocket,tmp,(int)strlen(tmp),0);
if(Ret==SOCKET_ERROR)
{
cout<
<
"
SendInfoError"
endl;
}
while(true)
memset(RecvBuffer,0x00,sizeof(RecvBuffer));
//为新申请的内存做初始化工作,其返回值为指向RecvBuffer的指针。
Ret=recv(CientSocket,RecvBuffer,MAX_PATH,0);
if(Ret==0||Ret==SOCKET_ERROR)
{
cout<
客户端退出!
closesocket(CientSocket);
//关闭客户端套接字
break;
}
接收到客户信息为:
RecvBuffer<
return0;
}
intmain(intargc,char*argv[])
WSADATAWs;
SOCKETServerSocket,CientSocket;
structsockaddr_inLocalAddr,ClientAddr;
intAddrLen=0;
HANDLEhThread=NULL;
//InitWindowsSocket
if(WSAStartup(MAKEWORD(2,2),&
Ws)!
=0)
InitWindowsSocketFailed:
:
GetLastError()<
return-1;
//CreateSocket
ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(ServerSocket==INVALID_SOCKET)
CreateSocketFailed:
LocalAddr.sin_family=AF_INET;
LocalAddr.sin_addr.s_addr=inet_addr(IP_ADDRESS);
LocalAddr.sin_port=htons(PORT);
memset(LocalAddr.sin_zero,0x00,8);
//BindSocket
Ret=bind(ServerSocket,(structsockaddr*)&
if(Ret!
BindSocketFailed:
Ret=listen(ServerSocket,10);
listenSocketFailed:
cout<
服务端已经启动"
AddrLen=sizeof(ClientAddr);
CientSocket=accept(ServerSocket,(structsockaddr*)&
ClientAddr,&
AddrLen);
if(CientSocket==INVALID_SOCKET)
AcceptFailed:
客户端连接:
inet_ntoa(ClientAddr.sin_addr)<
ClientAddr.sin_port<
hThread=CreateThread(NULL,0,ClientThread,(LPVOID)CientSocket,0,NULL);
/*lpsa:
线程句柄的安全属性,比如子进程是否可以继承这个线程句柄,一般情况设置为NULL
cbStack:
线程栈大小,一般取0表示默认大小
lpStartAddr:
线程入口函数
lpvThreadParam:
就是线程入口函数的参数,就是ThreadProc(void*lpParamete)的参数
fdwCreate:
控制线程创建的标志一般为0,表示线程立即启动。
如果你想创建之后把线程挂起来可以传入CREATE_SUSPENDED,传入这个参数你需要再适当的地方调用ResumeThread启动线程
lpIDThread:
是线程ID返回值,这个用来接收线程返回的ID*/
if(hThread==NULL)
CreateThreadFailed!
CloseHandle(hThread);
closesocket(ServerSocket);
closesocket(CientSocket);
WSACleanup();
客户端:
详细代码:
//multhreadClient.cpp:
)
//存储被WSAStartup函数调用后返回值
SOCKETCientSocket;
structsockaddr_inServerAddr;
charSendBuffer[MAX_PATH];
cout<
InitWind
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 并发套接字编程 并发 套接 编程 课程设计 报告