基于IPv6的网络编程.docx
- 文档编号:30268939
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:22
- 大小:110.04KB
基于IPv6的网络编程.docx
《基于IPv6的网络编程.docx》由会员分享,可在线阅读,更多相关《基于IPv6的网络编程.docx(22页珍藏版)》请在冰豆网上搜索。
基于IPv6的网络编程
课程设计报告
课程:
基于IPv6的网络编程
学号:
20082212285
姓名:
付希善
班级:
网络0802
教师:
李阿丽
鲁东大学
信息科学与工程学院
设计名称与内容
1、Winsock编程技术
WindowsSockets是Windows下网络编程的规范,是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。
经过不断完善它已成为Windows网络编程的事实上的标准。
Winsock是windows应用程序与下层网络协议之间的交互接口,通过socket,可以很容易的实现应用程序的网络连接。
Winsock也是Windows进行网络通信编程的API接口。
在网络编程中最常用的方案是客户/服务器模式,首先由服务器在指定的端口开通指定的服务,然后在客户机上通过指定服务器地址、服务端口来连接服务器以获取指定的服务。
二、聊天程序的功能及其相关网络协议
使用可靠的TCP来实现端到端的连接,使用到的协议是TCP协议。
采用的体系结构风格是服务器/客户端风格(C/S)。
服务器端建立socket连接,然后监听端口,等待客户端的连接。
在客户端连接之前,消息编辑窗口都设置为不可编辑状态。
当有客户端连接后,消息编辑窗口才设置为可编辑状态。
本程序的功能就是实现简单的基于TCP协议的聊天,即简单的消息发送。
3、聊天程序流程图和设计方案
1)聊天程序流程图
2)设计方案
服务器端的设计:
服务器端的界面由一个主窗口加三个控件组成,其中有两个edit控件和一个button控件。
程序设计窗口截图如下:
指定好服务端口号,本程序指定为1111。
然后建立窗口函数所关心的SOCKET通信消息,为程序为FD_ACCEPT和FD_READ。
在服务器端建立本地socket,用bind函数绑定本地套接字地址,最大连接数设置为5。
完成之后进行监听,看是否有客户端请求连接,若有则接受连接。
建立连接之后用,如果要发送数据,则在下面的sendEdit里面输入想要发送的内容,然后点击“发送”按钮。
”发送”按钮发送出一个WM_COMMAND消息,窗口函数接收WM_COMMAND消息,将接收到的消息用send函数发送出去。
当客户端有消息发送过来的时候,同样的要捕获消息,用recv函数进行接收数据。
通信结束之后释分配给套接字的资源。
客户端的设计:
客户端的界面设计和服务器端的基本一致,是窗口标题不同。
程序设计窗口截图如下:
指定好待连接的服务器的IP地址和服务器端口号,很显然地端口和服务器设置的一样,为1111。
然后建立窗口函数所关心的SOCKET通信消息,这里需要设置FD_ACCEPT和FD_CONNECT。
根据连接服务器的套接字,使用connect函数建立连接。
当要发送消息的时候则在下面的sendEdit里面输入想要发送的内容,然后点击“发送”按钮。
”发送”按钮发送出一个WM_COMMAND消息,窗口函数接收WM_COMMAND消息,将接收到的消息用send函数发送出去。
当客户端有消息发送过来的时候,同样的要捕获消息,用recv函数进行接收数据。
通信结束之后释分配给套接字的资源。
四、选择开发环境
开发环境:
VisualC++6.0
设计过程(步骤)或程序代码
源程序:
1)服务器端.
#include
#include
#defineID_RECEIVEEDIT1
#defineID_SENDEDIT2
#defineID_PUSHME3
#defineSERVER_PORT1111
#defineWM_SOCKET(WM_USER+1)
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
LPSTRlpcmdLine,intnCmdShow)
{
staticTCHARszAppName[]=TEXT("ChatServer");
staticTCHARszClassName[]=TEXT("ChatServerClass");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szClassName;
if(!
RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!
"),
szAppName,MB_ICONERROR);
return0;
}//注册窗口类
hwnd=CreateWindow(szClassName,TEXT("SimpleWinSockChatServer"),
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);//建立主窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}//消息循环
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
HINSTANCEhInstance;
staticHWNDhwndReceiveEdit,hwndSendEdit,hwndPushButton;
intnSize;
WSADATAWSAData;
staticstructsockaddr_inserver,from;
staticSOCKETlocal_server,local_listen;
intnError;
WORDwEvent,wError;
staticTCHARszReceive[1024];
staticTCHARszSend[1024];
switch(message)
{
caseWM_CREATE:
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
hwndReceiveEdit=CreateWindow(TEXT("edit"),
NULL,
WS_CHILD|WS_VISIBLE|WS_DISABLED|WS_HSCROLL|WS_VSCROLL
|WS_BORDER|ES_MULTILINE|ES_AUTOVSCROLL
|ES_AUTOHSCROLL|ES_LEFT,
0,0,0,0,
hwnd,
(HMENU)ID_RECEIVEEDIT,
hInstance,
NULL);
hwndSendEdit=CreateWindow(TEXT("edit"),
NULL,
WS_CHILD|WS_VISIBLE|WS_DISABLED|WS_HSCROLL|WS_VSCROLL
|WS_BORDER|ES_MULTILINE|ES_AUTOVSCROLL
|ES_AUTOHSCROLL|ES_LEFT,
0,0,0,0,
hwnd,
(HMENU)ID_SENDEDIT,
hInstance,
NULL);
hwndPushButton=CreateWindow("button",
"发送",
BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,
0,0,0,0,
hwnd,
(HMENU)ID_PUSHME,
hInstance,
NULL);//以上为建立三个窗口控件
if(nError=WSAStartup(MAKEWORD(2,0),&WSAData))
{
MessageBox(hwnd,"WinSockStartupError!
","Server",MB_ICONERROR|MB_OK);
returntrue;
}//指定socket版本为2.0
local_server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(local_server==INVALID_SOCKET)
{
MessageBox(hwnd,"SocketCreationError!
","Server",MB_ICONERROR|MB_OK);
WSACleanup();
returnTRUE;
}
if(SOCKET_ERROR==WSAAsyncSelect(local_server,hwnd,WM_SOCKET,FD_ACCEPT|FD_READ))
{
MessageBox(hwnd,"WSAAsyncSelectError!
","Server",MB_ICONERROR|MB_OK);
closesocket(local_server);
WSACleanup();
returnTRUE;
}//将套字接消息绑定到窗口消息。
server.sin_family=AF_INET;
server.sin_port=htons(SERVER_PORT);
if(SOCKET_ERROR==bind(local_server,(structsockaddr*)&server,sizeof(server)))
{
MessageBox(hwnd,"BindError!
","Server",MB_ICONERROR|MB_OK);
closesocket(local_server);
WSACleanup();
returnTRUE;
}//套接字地址绑定。
listen(local_server,5);
return0;
caseWM_SIZE:
MoveWindow(hwndReceiveEdit,0,0,LOWORD(lParam),HIWORD(lParam)/2-10,TRUE);
MoveWindow(hwndSendEdit,0,HIWORD(lParam)/2-10,LOWORD(lParam),HIWORD(lParam)/2-10,TRUE);
MoveWindow(hwndPushButton,0,HIWORD(lParam)-20,LOWORD(lParam),20,TRUE);
return0;
caseWM_SOCKET:
wEvent=WSAGETSELECTEVENT(lParam);//从lParam参数中获取事件代码
wError=WSAGETSELECTERROR(lParam);//从lParam参数中获取错误代码
switch(wEvent)
{
caseFD_ACCEPT:
if(wError)
{
MessageBox(hwnd,"AccepteError!
","Server",MB_ICONERROR|MB_OK);
return0;
}
nSize=sizeof(from);
local_listen=accept(local_server,(structsockaddr*)&from,&nSize);
EnableWindow(hwndSendEdit,TRUE);
return0;//接受并建立与客户端的TCP连接
caseFD_READ:
if(wError)
{
MessageBox(hwnd,"ReadError!
","Server",MB_ICONERROR|MB_OK);
return0;
}
recv(local_listen,szReceive,sizeof(szReceive)-1,0);
SetWindowText(hwndReceiveEdit,szReceive);
return0;
}
return0;//读取客户端发送来的数据
caseWM_SETFOCUS:
SetFocus(hwndSendEdit);
return0;
caseWM_COMMAND:
if(LOWORD(wParam)==ID_PUSHME)
if(HIWORD(wParam)==BN_CLICKED)
{
GetWindowText(hwndSendEdit,szSend,GetWindowTextLength(hwndSendEdit)+1);
send(local_listen,szSend,strlen(szSend)+1,0);
}
return0;//发送数据
caseWM_DESTROY:
closesocket(local_server);
closesocket(local_listen);
WSACleanup();
PostQuitMessage(0);
return0;
}
returnDefWindowProc(hwnd,message,wParam,lParam);
}
2)客户端
#include
#defineID_RECEIVEEDIT1
#defineID_SENDEDIT2
#defineID_PUSHME3
#defineSERVER_ADDR"192.168.1.3"
#defineSERVER_PORT1111
#defineWM_SOCKET(WM_USER+1)
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPreInstance,
LPSTRlpcmdLine,intnCmdShow)
{
staticTCHARszAppName[]=TEXT("ChatClient");
staticTCHARszClassName[]=TEXT("ChatClientClass");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szClassName;
if(!
RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!
"),
szAppName,MB_ICONERROR);
return0;
}//注册窗口类
hwnd=CreateWindow(szClassName,TEXT("SimpleWinSockChatClient"),
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);//建立窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}//消息循环
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
HINSTANCEhInstance;
staticHWNDhwndReceiveEdit,hwndSendEdit,hwndPushButton;
WSADATAWSAData;
staticstructsockaddr_inserver;
staticSOCKETremote_server;
intnError;
WORDwEvent,wError;
staticTCHARszReceive[1024];
staticTCHARszSend[1024];
switch(message)
{
caseWM_CREATE:
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
hwndReceiveEdit=CreateWindow(TEXT("edit"),
NULL,
WS_CHILD|WS_VISIBLE|WS_DISABLED|WS_HSCROLL|WS_VSCROLL
|WS_BORDER|ES_MULTILINE|ES_AUTOVSCROLL
|ES_AUTOHSCROLL|ES_LEFT,
0,0,0,0,
hwnd,
(HMENU)ID_RECEIVEEDIT,
hInstance,
NULL);
hwndSendEdit=CreateWindow(TEXT("edit"),
NULL,
WS_CHILD|WS_VISIBLE|WS_DISABLED|WS_HSCROLL|WS_VSCROLL
|WS_BORDER|ES_MULTILINE|ES_AUTOVSCROLL
|ES_AUTOHSCROLL|ES_LEFT,
0,0,0,0,
hwnd,
(HMENU)ID_SENDEDIT,
hInstance,
NULL);
hwndPushButton=CreateWindow("button",
"发送",
BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,
0,0,0,0,
hwnd,
(HMENU)ID_PUSHME,
hInstance,
NULL);//建立窗口架构
if(nError=WSAStartup(MAKEWORD(2,0),&WSAData))
{
MessageBox(hwnd,"WinSockStartupError!
","Client",MB_ICONERROR|MB_OK);
returnTRUE;
}//指定socket版本号为2.0
remote_server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(remote_server==INVALID_SOCKET)
{
MessageBox(hwnd,"SocketCreationError!
","Client",MB_ICONERROR|MB_OK);
WSACleanup();
returnTRUE;
}
if(SOCKET_ERROR==WSAAsyncSelect(remote_server,hwnd,WM_SOCKET,FD_CONNECT|FD_READ))
{
MessageBox(hwnd,"WSAAsyncSelectError!
","Client",MB_ICONERROR|MB_OK);
closesocket(remote_server);
WSACleanup();
returnTRUE;
}//消息绑定
server.sin_family=AF_INET;
server.sin_port=htons(SERVER_PORT);
server.sin_addr.S_un.S_a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 IPv6 网络 编程