基于IPv6的网络编程文件传输聊天.docx

上传人:b****5 文档编号:6241309 上传时间:2023-01-04 格式:DOCX 页数:18 大小:110.13KB
下载 相关 举报
基于IPv6的网络编程文件传输聊天.docx_第1页
第1页 / 共18页
基于IPv6的网络编程文件传输聊天.docx_第2页
第2页 / 共18页
基于IPv6的网络编程文件传输聊天.docx_第3页
第3页 / 共18页
基于IPv6的网络编程文件传输聊天.docx_第4页
第4页 / 共18页
基于IPv6的网络编程文件传输聊天.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

基于IPv6的网络编程文件传输聊天.docx

《基于IPv6的网络编程文件传输聊天.docx》由会员分享,可在线阅读,更多相关《基于IPv6的网络编程文件传输聊天.docx(18页珍藏版)》请在冰豆网上搜索。

基于IPv6的网络编程文件传输聊天.docx

基于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_

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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