基于WSAAsyncSelect模型的通信程序设计Word格式.doc

上传人:b****1 文档编号:13166482 上传时间:2022-10-07 格式:DOC 页数:8 大小:88KB
下载 相关 举报
基于WSAAsyncSelect模型的通信程序设计Word格式.doc_第1页
第1页 / 共8页
基于WSAAsyncSelect模型的通信程序设计Word格式.doc_第2页
第2页 / 共8页
基于WSAAsyncSelect模型的通信程序设计Word格式.doc_第3页
第3页 / 共8页
基于WSAAsyncSelect模型的通信程序设计Word格式.doc_第4页
第4页 / 共8页
基于WSAAsyncSelect模型的通信程序设计Word格式.doc_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

基于WSAAsyncSelect模型的通信程序设计Word格式.doc

《基于WSAAsyncSelect模型的通信程序设计Word格式.doc》由会员分享,可在线阅读,更多相关《基于WSAAsyncSelect模型的通信程序设计Word格式.doc(8页珍藏版)》请在冰豆网上搜索。

基于WSAAsyncSelect模型的通信程序设计Word格式.doc

编程环境:

VisualC++6.0

四、实验步骤和调试过程

源代码:

服务器端:

#include<

stdio.h>

winsock2.h>

#pragmacomment(lib,"

WS2_32"

) //链接到WS2_32.lib

#include<

math.h>

#defineWM_SOCKETWM_USER+101 //自定义消息

classCInitSock

{

public:

CInitSock(BYTEminorVer=2,BYTEmajorVer=2)

{

//初始化WS2_32.dll

WSADATAwsaData;

WORDsockVersion=MAKEWORD(minorVer,majorVer);

if(:

:

WSAStartup(sockVersion,&

wsaData)!

=0)

return;

}

~CInitSock()

{

:

WSACleanup();

};

CInitSocktheSock;

//加载套接字库

LRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);

boolisprime(intp){//判断p是否为质数

intsq=(int)sqrt(p);

boolflag=true;

inti;

for(i=2;

i<

=sq;

i++){

if(p%i==0){

flag=false;

break;

}

}

if(!

flag&

&

=sq)

returnfalse;

else

returntrue;

char*getallprime(intn){//将num以内的所有质数放在同一字符串中

charszprime[4096]="

质数:

"

;

intlen=strlen(szprime)+strlen("

"

);

for(inti=2;

i<

=n;

i++){

if(isprime(i)){

charsznum[10];

itoa(i,sznum,10);

char*sztemp=strcat(szprime,sznum);

len+=strlen(sznum);

szprime[len-1]='

'

;

len+=strlen("

}

//printf("

%s\n"

szprime);

returnszprime;

intmain()

charszClassName[]="

MainWClass"

WNDCLASSEXwndclass;

//用描述主窗口的参数填充WNDCLASSEX结构

wndclass.cbSize=sizeof(wndclass);

wndclass.style=CS_HREDRAW|CS_VREDRAW;

wndclass.lpfnWndProc=WindowProc;

wndclass.cbClsExtra=0;

wndclass.cbWndExtra=0;

wndclass.hInstance=NULL;

wndclass.hIcon=:

LoadIcon(NULL,IDI_APPLICATION);

wndclass.hCursor=:

LoadCursor(NULL,IDC_ARROW);

wndclass.hbrBackground=(HBRUSH):

GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName=NULL;

wndclass.lpszClassName=szClassName;

wndclass.hIconSm=NULL;

:

RegisterClassEx(&

wndclass);

//创建主窗口

HWNDhWnd=:

CreateWindowEx(

0,

szClassName,

"

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

NULL,

NULL);

if(hWnd==NULL)

MessageBox(NULL,"

创建窗口出错!

"

error"

MB_OK);

return-1;

USHORTnPort=4567;

//此服务器监听的端口号

//创建监听套节字

SOCKETsListen=:

socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

sockaddr_insin;

sin.sin_family=AF_INET;

sin.sin_port=htons(nPort);

sin.sin_addr.S_un.S_addr=INADDR_ANY;

//绑定套节字到本地机器

if(:

bind(sListen,(sockaddr*)&

sin,sizeof(sin))==SOCKET_ERROR)

printf("

Failedbind()\n"

//将套接字设为窗口通知消息类型。

WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);

//进入监听模式

listen(sListen,5);

//从消息队列中取出消息

MSGmsg;

while(:

GetMessage(&

msg,NULL,0,0))

//转化键盘消息

TranslateMessage(&

msg);

//将消息发送到相应的窗口函数

DispatchMessage(&

//当GetMessage返回0时程序结束

returnmsg.wParam;

}

LRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)

switch(uMsg)

caseWM_SOCKET:

{

//取得有事件发生的套节字句柄

SOCKETs=wParam;

//查看是否出错

if(WSAGETSELECTERROR(lParam))

{

:

closesocket(s);

return0;

}

//处理发生的事件

switch(WSAGETSELECTEVENT(lParam))

caseFD_ACCEPT:

//监听中的套接字检测到有连接进入

{

SOCKETclient=:

accept(s,NULL,NULL);

:

WSAAsyncSelect(client,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);

}

break;

caseFD_WRITE:

caseFD_READ:

charszText[1024]={0};

if(:

recv(s,szText,1024,0)==-1)

:

else

{

printf("

接收数据:

%s"

szText);

char*szReply=getallprime(1000);

//得到1000以内的所有质数

send(s,szReply,strlen(szReply),0);

//响应客户端,回以szReply

}

caseFD_CLOSE:

{

return0;

caseWM_DESTROY:

PostQuitMessage(0);

return0;

//将我们不处理的消息交给系统做默认处理

return:

DefWindowProc(hWnd,uMsg,wParam,lParam);

客户端:

//创建套节字

SOCKETs=:

if(s==INVALID_SOCKET)

Failedsocket()\n"

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

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1