并发套接字编程课程设计报告.doc

上传人:laozhun 文档编号:2396579 上传时间:2023-02-17 格式:DOC 页数:10 大小:529KB
返回 下载 相关 举报
并发套接字编程课程设计报告.doc_第1页
第1页 / 共10页
并发套接字编程课程设计报告.doc_第2页
第2页 / 共10页
并发套接字编程课程设计报告.doc_第3页
第3页 / 共10页
并发套接字编程课程设计报告.doc_第4页
第4页 / 共10页
并发套接字编程课程设计报告.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《并发套接字编程课程设计报告.doc》由会员分享,可在线阅读,更多相关《并发套接字编程课程设计报告.doc(10页珍藏版)》请在三一办公上搜索。

1、并发套接字编程课程设计报告 姓名:王延兴 班级:9班 学号:54110904 并发套接字编程课程设计报告班级:11级9班学号:54110904 姓名:王延兴一、 设计任务分析(一)实验环境操作系统:Windows或Linux编程工具及集成开发环境:VC+(二)实验目的和要求实验目的:掌握Linux或Windows平台上多线程、多进程或异步I/O的套接字编程。实验要求:(1)在Windows上,编写、编译1个客户机端程序和1个服务器端程序。要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机

2、端程序可执行文件。可选内容:(1)编写Linux或Windows平台上采取各并发方式的1种程序。(2)测试多线程、多进程或异步I/O的性能。二、 设计方案本实验采用的多线程的编程方式实现了并发u 各个函数功能: DWORD WINAPI ClientThread(LPVOID lpParameter) 接收每个客户端连接的处理函数hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);创建进程send(CientSocket, tmp, (int)strlen(tmp), 0);发送数据recv(C

3、ientSocket, RecvBuffer, MAX_PATH, 0);接收数据WSAStartup(MAKEWORD(2,2), &Ws) 初始化套接字类库socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 创建套接字bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr);绑定套接字 listen(ServerSocket, 10);侦听,队列大小为10u 设计思想: 创建TCP并发服务器 三、 详细设计服务器:详细代码:/ multhreadServer.cpp : Defin

4、es the entry point for the console application./#include stdafx.h#include #include #pragma comment(lib,ws2_32.lib) using namespace std;#include #include #define PORT 4000#define IP_ADDRESS 127.0.0.1DWORD WINAPI ClientThread(LPVOID lpParameter) /接收每个客户端连接的处理函数SOCKET CientSocket = (SOCKET)lpParameter;

5、int Ret = 0;char RecvBufferMAX_PATH; /在VC+6.0中, MAX_PATH的值为260。time_t t = time( 0 ); char tmp64; 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 )coutSend Info Errorendl;while ( true )memset(RecvBuffer, 0x00

6、, sizeof(RecvBuffer); /为新申请的内存做初始化工作, 其返回值为指向RecvBuffer的指针。Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);if ( Ret = 0 | Ret = SOCKET_ERROR ) cout客户端退出!endl;closesocket(CientSocket);/关闭客户端套接字 break;cout接收到客户信息为:RecvBufferendl;return 0;int main(int argc, char* argv)WSADATA Ws;SOCKET ServerSocket, C

7、ientSocket;struct sockaddr_in LocalAddr, ClientAddr;int Ret = 0;int AddrLen = 0;HANDLE hThread = NULL;/Init Windows Socketif ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )coutInit Windows Socket Failed:GetLastError()endl;return -1;/Create SocketServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (

8、ServerSocket = INVALID_SOCKET )coutCreate Socket Failed:GetLastError()endl;return -1;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);/Bind SocketRet = bind(ServerSocket, (struct sockaddr*)&LocalAddr

9、, sizeof(LocalAddr);if ( Ret != 0 )coutBind Socket Failed:GetLastError()endl;return -1;Ret = listen(ServerSocket, 10);if ( Ret != 0 )coutlisten Socket Failed:GetLastError()endl;return -1;cout服务端已经启动endl;while ( true )AddrLen = sizeof(ClientAddr);CientSocket = accept(ServerSocket, (struct sockaddr*)&

10、ClientAddr, &AddrLen);if ( CientSocket = INVALID_SOCKET )coutAccept Failed:GetLastError()endl;break;cout客户端连接:inet_ntoa(ClientAddr.sin_addr):ClientAddr.sin_portendl;hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);/*lpsa:线程句柄的安全属性,比如子进程是否可以继承这个线程句柄,一般情况设置为NULLcbStack:线程栈大小

11、,一般取0表示默认大小lpStartAddr:线程入口函数 lpvThreadParam:就是线程入口函数的参数,就是ThreadProc( void* lpParamete) 的参数fdwCreate:控制线程创建的标志一般为0,表示线程立即启动。如果你想创建之后把线程挂起来可以传入CREATE_SUSPENDED ,传入这个参数你需要再适当的地方调用ResumeThread 启动线程lpIDThread:是线程ID返回值,这个用来接收线程返回的ID*/if ( hThread = NULL )coutCreate Thread Failed!endl;break;CloseHandle(h

12、Thread);closesocket(ServerSocket);closesocket(CientSocket);WSACleanup();return 0;客户端: 详细代码:/ multhreadClient.cpp : Defines the entry point for the console application./#include stdafx.h#pragma comment(lib,ws2_32.lib)#include #include #include using namespace std;#define PORT 4000#define IP_ADDRESS 1

13、27.0.0.1int main(int argc, char* argv)WSADATA Ws; /存储被WSAStartup函数调用后返回值SOCKET CientSocket;struct sockaddr_in ServerAddr;int Ret = 0;int AddrLen = 0;HANDLE hThread = NULL;char SendBufferMAX_PATH;/Init Windows Socketif ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 ) coutInit Windows Socket Failed:GetLastErro

14、r()endl;return -1;/Create SocketCientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if ( CientSocket = INVALID_SOCKET )coutCreate Socket Failed:GetLastError()endl;return -1;ServerAddr.sin_family = AF_INET;ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);ServerAddr.sin_port = htons(PORT);memset

15、(ServerAddr.sin_zero, 0x00, 8);Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr);if ( Ret = SOCKET_ERROR )coutConnect Error:GetLastError()endl;return -1;elsecout连接成功!endl;char recvbuf100;memset(recvbuf, 0x00, sizeof(recvbuf); Ret = recv(CientSocket, recvbuf, 100, 0); if ( R

16、et = 0 | Ret = SOCKET_ERROR ) cout接受失败!endl; cout 接收到的服务器端时间: recvbufendl;while ( true )cin.getline(SendBuffer, sizeof(SendBuffer); /接受一个字符串,可以接收空格并输出Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);if ( Ret = SOCKET_ERROR )coutSend Info Error:GetLastError()endl;break;closesocket(CientSocket);WSACleanup();return 0;u 运行界面: 四、 总结与体会掌握Windows平台上多线程的套接字编程,同时实现了客户端可以一直向服务器发送信息的功能。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号