zoukankan      html  css  js  c++  java
  • 网络编程1. 套接字编程基本知识

    网络编程1. 套接字编程基本知识

    1.首先网络编程使用C++,要引入一些库

             #include <Windows.h>

             并且需要使用静态链接库,

             这里使用的是编译语句#pragma comment(lib,"ws2_32.lib") 相当于将ws2_32.lib静态链接库加入到项目中,效果和添加引用是一样的。

             ws2_32.lib对应的是ws2_32.dll,提供对于常见网络编程的API接口支持,使用其中的网络接口就需要将ws2_32.dll添加到工程,否则需要动态的加载ws2_32.dll

    2. WSAStartup 函数的介绍

             WSAStartupWindows SockNDs AsynchronousWindows 异步套接字) 的启动命令, windows下的网络编程软件Winsock1, Winsock2的一个命令。

             WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用Socket程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数表示程序请求使用的Socket版本,高字节表示副版本,低字节表示主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数的时候,操作系统根据请求的Socket版本来搜索响应的Socket库,绑定到Socket库到应用程序中。在之后的程序中可以调用Socket库中的其他的socket函数。

             int WSAStartup(WORD wVersionRequest, LPWSADATA lpWSAData);

             参数介绍:

                       wVersionRequest: 一个双字节数值, 使用MAKEWORD(2,2)生成;

                       lpWSAData: 指向一个WSADATA的数据结构的指针,用于接收Windows Sockets实现的细节。

             If the function return 0, 表示成功。

             开启Windows Sock Asynchronous,对应当程序结束的时候,就应该关闭,WSACleanup()用于接触于Socket库的绑定并且释放掉Socket库所占用的系统资源。

    3.常见的一些函数在WinSocket编程中使用的介绍

    3.1 gethostname() // 获取本地主机的主机名

             函数原型: int PASCAL FAR gethostname( char FAR * name, int namelen);

             Name:用于指向主机名缓冲区的指针,namelen 缓冲区的大小。

             Return Value:无错误的话,返回0,反之返回对应的错误代码。

    #include <iostream>

    #include <Windows.h>

    using namespace std;

     

    #pragma comment(lib,"ws2_32.lib")

    int main(){

        WSADATA wsa ;// WSADATA 结构是用来保存函数WSAStartup 返回的Windows socket初始化信息

        if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){

            cout << "套接字初始化失败"<<  endl;

            Sleep(3000);

            exit(-1);

        }else{

            cout << "套接字初始化成功" << endl;

        }

     

        char buf[255];

     

        if( gethostname(buf,sizeof(buf)) == SOCKET_ERROR  ){

            cout << "获取本地主机的Name失败:"<<WSAGetLastError()<< SOCKET_ERROR << endl;

        }else{

            cout <<"本地主机的名字是:" << buf << endl;

        }

        WSACleanup();// 完成清理工作

        return 0;

    }

    3.2获取主机的IP gethostbyname(const char* name);

    hostent 是一个数据结构,保存从gethostbyname返回的信息,包括主机的IP地址类型IPV4IPV6,主机的别名,主机的IP长度,h_addr_list[]

             需要使用in_addr 类型保存一个IP地址,并且需要将IP地址转换成为字符串的格式,使用的是const char * inet_ntoa(in_addr in); pht->h_addr_list[i] 转换成为(in_addr*)的指针,然后再通过指针获取器内容,转换成为字符串的形式。

    hostent* pht = gethostbyname("www.google.com");

        if(pht==NULL){

            cout << WSAGetLastError() << endl;

        }else{

            //cout << AF_INET << endl;

            cout << "h_addrtype:" <<  pht->h_addrtype << endl;

            cout << "h_aliases:" << pht->h_aliases << endl;

            cout << "h_length:" << pht->h_length << endl;

            cout << "h_name:"<< pht->h_name << endl;

            for(int i = 0; pht->h_addr_list[i] != NULL;i++){

                in_addr addr = *(in_addr*) pht->h_addr_list[i];

                cout <<inet_ntoa(addr) << endl;

            }

        }

     

    #include <iostream>

    #include <Windows.h>

    #include <process.h>

    using namespace std;

     

     

     

    #pragma comment(lib,"ws2_32.lib")

     

    int main(){

        WSADATA wsa ;// WSADATA 结构是用来保存函数WSAStartup 返回的Windows socket初始化信息

        if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){

            cout << "套接字初始化失败"<<  endl;

            Sleep(3000);

            exit(-1);

        }else{

            cout << "套接字初始化成功" << endl;

        }

     

        char buf[255];

     

        if( gethostname(buf,sizeof(buf)) == SOCKET_ERROR  ){

            cout << "获取本地主机的Name失败:"<<WSAGetLastError()<< SOCKET_ERROR << endl;

        }else{

            cout <<"本地主机的名字是:" << buf << endl;

        }

       

        hostent* pht = gethostbyname(buf);

        if(pht==NULL){

            cout << WSAGetLastError() << endl;

        }else{

            //cout << AF_INET << endl;

            cout << "h_addrtype:" <<  pht->h_addrtype << endl;

            cout << "h_aliases:" << pht->h_aliases << endl;

            cout << "h_length:" << pht->h_length << endl;

            cout << "h_name:"<< pht->h_name << endl;

            for(int i = 0; pht->h_addr_list[i] != NULL;i++){

                in_addr addr = *(in_addr*) pht->h_addr_list[i];

                cout << "IP:" <<inet_ntoa(addr) << endl;

            }

        }

     

        SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

        if(serverSocket == INVALID_SOCKET){

            cout << "创建套接字失败" << endl;

            cout << WSAGetLastError() << endl;

            Sleep(3000);

            exit(-1);

        }

     

        sockaddr_in  serverAddress;

        int listen_port = 8999;

        memset(&serverAddress,0,sizeof(serverAddress));

        serverAddress.sin_family = AF_INET;

        serverAddress.sin_port = htons(listen_port);

        serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

     

        if( bind(serverSocket,(sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR){

            cout << "绑定套接字端口失败" << endl;

            cout << WSAGetLastError() << endl;

            Sleep(3000);

            exit(-1);

        }else{

            cout << "成功绑定端口:" << listen_port << endl;

        }

     

        if( listen(serverSocket,SOMAXCONN) == SOCKET_ERROR){

            cout <<"监听失败" << WSAGetLastError() << endl;

     

            Sleep(3000);

            exit(-1);

        }else{

            cout << "成功监听端口:"<< listen_port  << endl;

        }

     

       

       

     

        while(true){

            cout << "yang" << endl;

            SOCKET chatSocket;

            sockaddr_in clientAddress;

            memset(&clientAddress,0,sizeof(clientAddress));

            int addrlen = sizeof(clientAddress);

            if( (chatSocket = accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))== SOCKET_ERROR){

                cout << "接受连接失败" << WSAGetLastError()<< endl;

                continue;

            }else{

                cout << "接受来自" << inet_ntoa(clientAddress.sin_addr) <<"的连接"<< endl;

            }

     

     

        }

     

        WSACleanup();// 完成清理工作

        return 0;

    }

  • 相关阅读:
    Oracle数据库的左连接和右连接(+)
    Web文件上传模块 Plupload
    增加反向链接的35个技巧
    google map api 与jquery结合使用(1)控件,监听器[转帖]
    教你在windows 7/xp 下安装使用mencoder
    Oracle 全文索引
    提高关键词排名的28个SEO技巧
    二叉树遍历及C语言实现
    小额担保业务管理系统详细设计介绍
    C#与数据结构二叉树的遍历
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3439335.html
Copyright © 2011-2022 走看看