• Windows 网络通讯开发


    Windows 网络通讯开发

    一、Windows网络开发API

      由于C++标准库中没有网络库,所以进行网络开发的时候要调用系统API。Windows通讯开发API包括以下几个基本函数及成员类型:

    1. Header:Winsock.h 和 Winsock2.h(最新的)

    具体Winsock2.h包含两大块内容:Socket Functions和Microsoft Windows-Specific Extension Functions

    Socket Functions:

    • socket:An incoming connection is acknowledged and associated with an immediately created socket. The original socket is returned to the listening state.
    SOCKET socket(int af,int type,int protocol);
    
    • bind:Assigns a local name to an unnamed socket.
    • listen:Listens for incoming connections on a specified socket.(一般在服务器端使用)
    • accept:An incoming connection is acknowledged(被确认) and associated with an immediately created socket. The original socket is returned to the listening state.(一般在服务器端使用)
    • connect:Initiates a connection on the specified socket.(一般在客户端使用)
    • send:Sends data to a connected socket.
    • sendto:Sends data to either a connected or unconnected socket.
    • recv:Receives data from a connected or unconnected socket.
    • recvfrom:Receives data from either a connected or unconnected socket.
    • htonl/htons/ntohl/ntohs:
      h代表:host-byte;n代表:network-byte;l代表:32-bit;s代表:16-bit;
    • inet_addr:Converts a character string representing a number in the Internet standard ".'' notation to an Internet address value.
    • inet-ntoa:Converts an Internet address value to an ASCII string in ".'' notation that is, "a.b.c.d''.

    Microsoft Windows-Specific Extension

    Alt text
    Alt text
    Alt text

    2. Library:Use Ws2_32.lib.

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

    3. 使用方法举例:

    #include "stdafx.h"
    #include <Winsock2.h>
    #include <iostream>
    using namespace std;
    const int PORT = 10051;
    int main(int argc, char* argv[])
    {
    	WSADATA wd;
    	WSAStartup(0x202,&wd);
    	SOCKET sock = socket(AF_INET,SOCK_STREAM,0);//侦听套接字
    	if(sock == INVALID_SOCKET)
    	{
    		cout << "socket函数失败:" << WSAGetLastError() << endl;
    		return -1;
    	}
    	sockaddr_in sa = {AF_INET,htons(PORT)};
    	int n = bind(sock,(sockaddr*)&sa,sizeof(sa));
    	if(n == SOCKET_ERROR)
    	{
    		cout << "bind函数失败:" << WSAGetLastError() << endl;
    		return -1;
    	}
    	listen(sock,5);
    
    	int nLen = sizeof(sa);
    	SOCKET socka = accept(sock,(sockaddr*)&sa,&nLen);//如何循环等待多个客户端同时连接进来
    	if(socka==INVALID_SOCKET)
    	{
    		cout << "accept函数失败:" << WSAGetLastError() << endl;
    		return -1;
    	}
    	cout << "有人连接进来:" << inet_ntoa(sa.sin_addr) << "-" << htons (sa.sin_port)<< endl;
    	char s[256];
    	while((	n = recv(socka,s,sizeof(s)-1,0)) > 0)
    	{
    		s[n] = 0;
    		cout << s << endl;
    	}
    	cout << WSAGetLastError() << endl;
    	return 0;
    }
    

    详情参见:MSDN October 2001->Platform SDK: Windows Sockets

    二、CAsyncSocket Class

    • 定义:
      Class CAsyncSocket encapsulates the Windows Socket Functions API, providing an object-oriented abstraction for programmers who want to use Windows Sockets in conjunction with MFC.
      这个类封装了Window 套接字API,是比较底层的通讯类。
    • 主要通讯流程:
      To use a CAsyncSocket object, call its constructor, then call the Create function to create the underlying socket handle (type SOCKET), except on accepted sockets. For a server socket call the Listen member function, and for a client socket call the Connect member function. The server socket should call the Accept function upon receiving a connection request. Use the remaining CAsyncSocket functions to carry out communications between sockets. Upon completion, destroy the CAsyncSocket object if it was created on the heap; the destructor automatically calls the Close function. The SOCKET data type is described in the article Windows Sockets: Background.

    详细使用情况参见Microsoft Help Veiwer 2.0

    三、CSocket Class

    Derives from CAsyncSocket and inherits its encapsulation of the Represents a higher level of abstraction of the Windows Sockets API than that of a CAsyncSocket object.
    这个类是继承CAsyncSocket Class 的,它使用比其父类更加便捷。

    详细使用情况参见Microsoft Help Veiwer 2.0

  • 相关阅读:
    执行预定义命令
    利用jemalloc优化mysql
    ssh增加密匙登录
    vsftpd增加ssl安全验证
    利用脚本获取mysql的tps,qps等状态信息
    innodb_buffer_pool_size 大小建议
    linux多核cpu下的负载查看
    DDoS deflate+iptables防御轻量级ddos攻击
    CentOS通过日志反查入侵
    shell读取文件每行,并执行命令
  • 原文地址:https://www.cnblogs.com/laohan1221/p/6244503.html
Copyright © 2020-2023  润新知