⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用vc6制作互通消息.txt

📁 用vc制作互通消息的文档说明
💻 TXT
📖 第 1 页 / 共 2 页
字号:
用vc6.0编服务器与客户机互相传送消息的程序 

                                           南京理工大学 
                                               朱晓华 

                    ---- 网络编程已经成为一种时髦,以TCP/IP协议的网络更为流
                    行.自己编一个服务器与客户机互相传送消息的程序,以便增加自
                    己网络编程的经验.下面我就介绍一下我编的程序. 

                    ---- 首先介绍服务器程序: 

                    ---- 1.创建一个名为"server"的项目,单文档界面. 

                    ---- 2.在serverview.h中加入代码: 

                                    #include "winsock.h"
                              添加变量:
                                    CSize   sizeTotal;//控制滚动条
                                    int     count;//信息条数
                                    CString m_data[1000];//信息存放
                                    char    Hostname[260];
                                    char    Hostaddress[20];//主机IP地址
                                    SOCKET  m_sock;
                                    HANDLE  m_hListenThread;//线程
                                    BOOL    m_bInitialized;//是否初始化
                                    WSADATA WSAData;
                                    BOOL    flag;
                                    SOCKADDR_IN saClnt;
                                    int     saClntLen;
                                    BOOL    Isconnect;//是否连接    
                            3.在serverview.cpp中重载CServerView()构造器,
                    创建并绑定嵌套字:
                                    CServerView::CServerView()
                    {       // TODO: add construction code here
                            Isconnect=FALSE;
                            flag=FALSE;
                            sizeTotal.cy=350;
                            sizeTotal.cx=300;
                            m_hListenThread;
                            count=5;
                            int status;
                            WSADATA wsaData;
                            m_data[0]="initializing Windows Sockets DLL....";
                            if((status=WSAStartup(0x0101,&wsaData))==0)
                            {       m_data[0]+="Succeeded";
                                    m_bInitialized=TRUE;
                            }
                            else
                            {       m_bInitialized=FALSE;
                            }
                            m_sock=socket(AF_INET,SOCK_DGRAM,0);
                            m_data[1]="Creating socket....";
                            if(m_sock==INVALID_SOCKET)
                            {       m_data[1]+="Failed";
                            }
                            m_data[1]+="Succeeded";
                            m_data[2]="Binding socket....";
                            sockaddr_in sa;
                            sa.sin_family=AF_INET;
                            sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
                            sa.sin_port=htons(5050);
                            if(bind(m_sock,(PSOCKADDR)&sa,
                    sizeof(sa))==SOCKET_ERROR)
                            {       m_data[2]+="Failed";
                                    closesocket(m_sock);
                            }
                            m_data[2]+="Succeeded";
                            m_data[3]="Creating listener thread....";
                            unsigned long idThread;
                            m_hListenThread=CreateThread(NULL,0,
                    (LPTHREAD_START_ROUTINE)Listen,
                    (void *)this,0,&idThread);
                            if(m_hListenThread)
                            {       m_data[3]+="Succeeded";
                                    m_data[4]+="Listening....";
                            }
                            else
                                    m_data[4]+="Failed";
                    } 
                            4.在析构函数中完成必需的清除操作:
                                    CServerView::~CServerView()
                    {       if(m_bInitialized)
                            WSACleanup();
                            closesocket(m_sock);
                            if(m_hListenThread)
                                    ::TerminateThread(m_hListenThread,0);
                    }       
                            5.定义接收和处理消息的线程:
                                    long WINAPI Listen(CServerView *pView)
                    {       char msg[2000]="";
                            int     nchar;
                            SOCKADDR_IN saClnt;
                            int saClntLen;
                            while(1)
                            {       saClntLen=sizeof(saClnt);
                                    nchar=recvfrom(pView- >m_sock,msg,
                    1024,0,(PSOCKADDR)&saClnt,&saClntLen);
                                    if(nchar< 0)
                                    {       pView- >m_data[pView- >count++]+
                    ="Error in recvfrom\n";
                                            pView- >InvalidateRect(NULL);
                                    }
                                    else
                                    {       

                    switch(msg[0])
                            {
                            case    'A':
                       wsprintf(msg,"A:Client from %s attached\n",
                    inet_ntoa(saClnt.sin_addr));
                                    pView- >m_data[pView- >count++]=msg;
                                    pView- >flag=TRUE;
                                    pView- >InvalidateRect(NULL);
                                    pView- >Isconnect=TRUE;
                                    pView- >saClnt=saClnt;
                                    pView- >saClntLen=saClntLen;
                            sendto(pView- >m_sock,msg,1024,0,
                    (PSOCKADDR)&saClnt,saClntLen);
                                    break;
                            
                            case 'D':
                    wsprintf(msg,"D: Client form %s detached\n",
                    inet_ntoa(saClnt.sin_addr));
                                    pView- >m_data[pView- >count++]=msg;
                                    pView- >flag=TRUE;
                                    pView- >InvalidateRect(NULL);
                                    pView- >Isconnect=FALSE;
                                    sendto(pView- >m_sock,msg,1024,0,
                    (PSOCKADDR)&saClnt,saClntLen);
                                    break;

                                            case 'R':
                                    saClntLen=sizeof(saClnt);
                                    pView- >m_data[pView->count++]=msg;
                                    pView- >flag=TRUE;
                                    pView- >InvalidateRect(NULL);
                                    break;

                                            default:
                                                    break;
                                            }

                                    }
                                    
                            }
                            return(0);
                    }
                            6.在程序菜单项中添加"本机IP地址":
                                    void CServerView::OnIp() 
                    {       int WSAReturn;
                            WSAReturn=WSAStartup( 0x0101, &WSAData );
                            if( WSAReturn == 0 ){
                            gethostname( Hostname, 260 );
                            struct hostent *pHostEnt;
                            HostEnt = gethostbyname( Hostname);
                            if( pHostEnt != NULL ){
                            wsprintf( Hostaddress, "%d.%d.%d.%d",
                            ( pHostEnt- >h_addr_list[0][0] & 0x00ff ),
                            ( pHostEnt - >h_addr_list[0][1] & 0x00ff ),
                            ( pHostEnt- >h_addr_list[0][2] & 0x00ff ),
                            ( pHostEnt- >h_addr_list[0][3] & 0x00ff ) );
                            CString out;    
                            out.Format(Hostaddress);
                            AfxMessageBox(out);
                                    }
                            }
                    }
                            
                    7.在程序菜单中添加"发送消息":
                                    void CServerView::OnSendmessage() 
                    {// TODO: Add your command handler code here
                            char msg[2000];
                            Csend Sendmessage;
                            if(Sendmessage.DoModal()==
                    IDOK&&!Sendmessage.m_Message.IsEmpty())
                            {       wsprintf(msg,"R: "+
                    Sendmessage.m_Message);
                                    sendto(m_sock,msg,1024,0,
                    (PSOCKADDR)&saClnt,saClntLen);
                                    m_data[count++]=Sendmessage.m_Message;
                                    flag=TRUE;
                                    InvalidateRect(NULL);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -