zoukankan      html  css  js  c++  java
  • windows下C++网络编程入门

    winsocket分为流套接字和数据报套接字。winsocket编程一般都采用C/S模式。
    在server端的流程一般如下:
    1、初始化winsocket
    2、建立socket
    3、与本机进行邦定(bind)
    4、开始监听(listen)
    5、然后与客户端建立连接(accept)
    6、然后与客户端进行通信(send, recv)
    7、当通信完成以后,关闭连接
    8、释放winsocket的有关资源
    在Client端的流程一般如下:
    1、初始化winsocket
    2、建立socket
    3、与本机进行邦定(bind)
    4、与服务器进行连接(connect)
    5、与服务器进行通信(send, recv)
    6、当通信完成以后,关闭连接
    7、释放winsocket占用的资源
    和JAVA的网络编程相比我发现了有三个不一样的地方,在JAVA中服务器端的socket是一个serverSocket Class,Client端建立的socket是socket Class;在JAVA中没有第一步(初始化)和第三步(bind)过程。
    之所以需要初始化winsocket,是因为Winsock的服务是以动态连接库Winsock DLL形式实现的,所以必须先调用初始化函数(WSAStartup)对Winsock DLL进行初始化,协商Winsock的版本支持,并分配必要的资源;关于第三步中的bind过程,当套接字(socket)创建以后,该套接字并没有与本机地址和端口等信息相联,bind过程将完成这一任务。
    现在开始我的第一个程序,进行Windows网络编程,需要在的程序中包含winsock2.h或mswsock.h头文件,同时你需要添加引入ws2_32.lib或winsock32.lib库文件,他们分别在Microsoft Visual Studio 8VCPlatformSDKLib
    我程序的功能就是实现client和server进行连接,当连接上了,在两端分别显示连接成功(主要是为了熟悉上面的流程)
    Server端的代码:

    #include "stdafx.h"
    #include "WinSock2.h"
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        WSADATA  wsaData;
        SOCKET ListeningSocket;
        SOCKADDR_IN ServerAddr;
        SOCKET NewConnection;
        SOCKADDR_IN ClientAddr;
        int Port = 5150;
    
        WSAStartup(MAKEWORD(2, 2), &wsaData);// 初始化Windows Socket 2.2
    
        ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建一个新的Socket来响应 客户端的连接请求;AF_INET字段是表示网络地址的类型,AF_INET表示是internet域中进行通信;SOCK_STREAM表示socket的类型,SOCK_STREAM表示是流套接字IPPROTO_TCP表明协议类型,IPPROTO_TCP或者0表示TCP/IP协议
    
        ServerAddr.sin_family = AF_INET;                                                         // 填写服务器地址信          
        ServerAddr.sin_port = htons(Port);                                                        // 端口为5150
        ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY表示机器上的所用网络地址 ; 比如你的机器上有两张网卡,那么到达这两张网卡的数据,你的socket都可以得到通知;htonl将IP地址转换为网络格式
        bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));        //绑定监听端口;当调用socket函数创建套接字后,该套接字并没有与本机地址和端口等信息相连,bind函数将完成这些工作
    
        listen(ListeningSocket, 2);                                                                                 // 开始监听,指定最大同时连接数为2
    
        int len = sizeof(ClientAddr);
        NewConnection = accept(ListeningSocket, (SOCKADDR *)&ClientAddr, &len);// 接受新的连接
    
        cout << "************************************************" << endl;
        cout << "****new client has been connected******" << endl;
        cout << "*************************************************" << endl;
    
        /* 当连接建立之后,我们就可以在这里和client进行通信,传输数据了*/
    
        closesocket(NewConnection);                                                                               //关闭连接
        closesocket(ListeningSocket);                                                                              //并关闭监听Socket
    
        WSACleanup();                                                                                                     // 释放Windows Socket DLL的相关资源
    
        return 0;
    }

    Client端代码:

    #include "stdafx.h"
    #include "WinSock2.h"
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        WSADATA wsaData;
        SOCKET s;
        SOCKADDR_IN ServerAddr;
        int Port = 5150;
    
        WSAStartup(MAKEWORD(2, 2), &wsaData);                                     //初始化Windows Socket 2.2      
        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);                           // 创建一个新的Socket来连接服务器  
    
        ServerAddr.sin_family = AF_INET;
        ServerAddr.sin_port = htons(Port);
        ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");                                //在程序中我与本机进行通信
        int result = connect(s, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));   // 向服务器发出连接请求
        if (result == 0){                                                                                                //result==0表示连接成功
            cout << "Client has connected to server!";
        }
    
        closesocket(s);
        WSACleanup();
    
        return 0;
    }

     总结:建立网络连接的过程

    连接ws2_32.lib 
    scoket 建立套接字
    bind绑定套接字
    listen套接字监听
    accept接受连接请求
    connect发起连接请求
    send发送数据
    recv接收数据
  • 相关阅读:
    常用正则表达式
    C#链接常见数据库的方法
    [转]hibernate分页原理
    2020hdu多校第一场比赛及补题
    2020hdu多校第四场比赛及补题
    2020hdu多校第五场比赛及补题
    2020hdu多校第三场比赛及补题
    2020hdu多校第二场比赛及补题
    第二次vj团队赛补题
    字符串距离问题
  • 原文地址:https://www.cnblogs.com/lishuai0214/p/4198457.html
Copyright © 2011-2022 走看看