并发套接字编程课程设计报告_第1页
并发套接字编程课程设计报告_第2页
并发套接字编程课程设计报告_第3页
并发套接字编程课程设计报告_第4页
并发套接字编程课程设计报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

3、tSocket, 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并发服务器 3、 详细设计服务器:详细代码:/ multhreadServer.cpp :

4、Defines the entry point for the console application./#include "stdafx.h"#include <iostream>#include <Windows.h>#pragma comment(lib,"ws2_32.lib") using namespace std;#include <winsock2.h>#include <time.h>#define PORT 4000#define IP_ADDRESS "127.0.0.1&q

5、uot;DWORD WINAPI ClientThread(LPVOID lpParameter) /接收每个客户端连接的处理函数SOCKET CientSocket = (SOCKET)lpParameter;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(Cie

6、ntSocket, tmp, (int)strlen(tmp), 0);if ( Ret = SOCKET_ERROR )cout<<"Send Info Error"<<endl;while ( true )memset(RecvBuffer, 0x00, sizeof(RecvBuffer); /为新申请的内存做初始化工作, 其返回值为指向RecvBuffer的指针。Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);if ( Ret = 0 | Ret = SOCKET_ERROR ) cout&l

7、t;<"客户端退出!"<<endl;closesocket(CientSocket);/关闭客户端套接字 break;cout<<"接收到客户信息为:"<<RecvBuffer<<endl;return 0;int main(int argc, char* argv)WSADATA Ws;SOCKET ServerSocket, CientSocket;struct sockaddr_in LocalAddr, ClientAddr;int Ret = 0;int AddrLen = 0;HANDLE

8、 hThread = NULL;/Init Windows Socketif ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )cout<<"Init Windows Socket Failed:"<<GetLastError()<<endl;return -1;/Create SocketServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if ( ServerSocket = INVALID_SOCKET )cout<<&qu

9、ot;Create 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, size

10、of(LocalAddr);if ( Ret != 0 )cout<<"Bind Socket Failed:"<<GetLastError()<<endl;return -1;Ret = listen(ServerSocket, 10);if ( Ret != 0 )cout<<"listen Socket Failed:"<<GetLastError()<<endl;return -1;cout<<"服务端已经启动"<<endl;whi

11、le ( true )AddrLen = sizeof(ClientAddr);CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);if ( CientSocket = INVALID_SOCKET )cout<<"Accept Failed:"<<GetLastError()<<endl;break;cout<<"客户端连接:"<<inet_ntoa(ClientAddr.sin

12、_addr)<<":"<<ClientAddr.sin_port<<endl;hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);/*lpsa:线程句柄的安全属性,比如子进程是否可以继承这个线程句柄,一般情况设置为NULLcbStack:线程栈大小,一般取0表示默认大小lpStartAddr:线程入口函数 lpvThreadParam:就是线程入口函数的参数,就是ThreadProc( void* lpParamete) 的参数fdwCre

13、ate:控制线程创建的标志一般为0,表示线程立即启动。如果你想创建之后把线程挂起来可以传入CREATE_SUSPENDED ,传入这个参数你需要再适当的地方调用ResumeThread 启动线程lpIDThread:是线程ID返回值,这个用来接收线程返回的ID*/if ( hThread = NULL )cout<<"Create Thread Failed!"<<endl;break;CloseHandle(hThread);closesocket(ServerSocket);closesocket(CientSocket);WSACleanup(

14、);return 0;客户端: 详细代码:/ multhreadClient.cpp : Defines the entry point for the console application./#include "stdafx.h"#pragma comment(lib,"ws2_32.lib")#include <iostream>#include <Windows.h>#include <winsock2.h>using namespace std;#define PORT 4000#define IP_ADDR

15、ESS "127.0.0.1"int 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 ) cout<<"Ini

16、t Windows Socket Failed:"<<GetLastError()<<endl;return -1;/Create SocketCientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if ( CientSocket = INVALID_SOCKET )cout<<"Create Socket Failed:"<<GetLastError()<<endl;return -1;ServerAddr.sin_family = AF_INE

17、T;ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);ServerAddr.sin_port = htons(PORT);memset(ServerAddr.sin_zero, 0x00, 8);Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr);if ( Ret = SOCKET_ERROR )cout<<"Connect Error:"<<GetLastError()<<end

18、l;return -1;elsecout<<"连接成功!"<<endl;char recvbuf100;memset(recvbuf, 0x00, sizeof(recvbuf); Ret = recv(CientSocket, recvbuf, 100, 0); if ( Ret = 0 | Ret = SOCKET_ERROR ) cout<<"接受失败!"<<endl; cout<<" 接收到的服务器端时间: "<<recvbuf<<endl;while ( true )cin.getline(SendBuffer, sizeof(SendBuffer); /接受一个字符串,可以接收空格并输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论