《ASCE1885的网络编程》---Winsock APIの网络信息获取函数

Winsock API函数参考 Winsock API函数参考,编写与网络相关的windows程序 立即下载

网络中的主机需要安装TCP/IP协议或其他协议才能进行通信,网络应用程序有时需要获取主机上或网络有关的信息,这些信息一般存放在数据文件中。如Unix系统中,主机名存放在/etc/hosts文件中,网络信息则存放在etc/networks文件中,因此这类获取主机上与网络有关的信息的函数也叫数据库函数。

与网络有关的信息主要分为4大类:

主机信息:函数名一般以gethostby开头,在程序中较多使用;

网络信息:函数名一般以getnetby开头,在程序中较少使用;

协议信息:函数名一般以getprotoby开头,在程序中较少使用;

服务信息:函数名一般以getservby开头,在程序中较多使用。

 

1)获得主机名---gethostname()

gethostname()函数用来获得一台主机的名称信息:

int gethostname(

  __out  char *name, //一个指向将要存放主机名的缓冲区的指针

  __in   int namelen //缓冲区的长度

);

如果函数调用成功,则返回0;如果调用失败,则返回SOCKET_ERROR错误信息。可以通过调用WSAGetLastError()来得到一个特定的错误代码,错误代码说明如下:

WSAEFAULT  //名字长度参数太小

WSANOTINITIALISED  //在应用这个API前,必须成功调用WSAStartup()

WSAENETDOWN //Windows Sockets实现检测到了网络子系统的错误

WSAEINPROGRESS       //一个阻塞Windows Sockets操作正在进行

 

该函数把本地主机名存放入由name参数指定的缓冲区。主机名的形式取决于Windows Sockets系统的实现,它可能是一个简单的主机名,或者是一个域名。不管是哪种形式,该函数返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()函数中使用。

 

2)获得与套接字相连的远程协议地址---getpeername()

getpeername()函数格式如下:

int getpeername(

  __in     SOCKET s, //一个已经建立连接的套接字描述字

  __out    struct sockaddr *name, //指向返回的远程协议地址

  __inout  int *namelen //远程协议地址长度

);

函数调用成功,返回0;调用失败,则返回SOCKET_ERROR错误信息,可以调用WSAGetLastError()函数来获取对该错误的进一步描述,错误代码如下:

WSANOTINITIALISED  //在使用此函数前应成功调用WSAStartup()

WSAENETDOWN //Windows套接字实现检测到网络子系统失效

WSAEFAULT  //namelen参数不够大

WSAEINPROGRESS       //一个阻塞Windows套接口调用正在进行中

WSAENOTCONN //套接口未建立连接

WSAENOTSOCK   //描述字不是一个套接口

getpeername()函数用于从套接口s中获取与它绑定的远程协议的地址信息,并将它存放在sockaddr类型的name结构中。它只能用于已经建立连接的套接口。对于数据报类型的套接口来说,它只能返回先前调用connect()函数时使用的对等端信息,在sendto()函数中使用过的对等端信息不能被返回。

 

3)获得套接口本地协议地址---getsockname()

getsockname()函数的格式如下:

int getsockname(

  __in     SOCKET s, //标识一个套接口描述字

  __out    struct sockaddr *name, //指向返回的本地协议地址的指针

  __inout  int *namelen //本地协议地址长度,当函数调用完成后,它可以返回实际的本地地址长度

);

调用成功返回0,失败则返回SOCKET_ERROR错误信息,可以通过调用WSAGetLastError()函数获取进一步错误描述。错误代码如下:

WSANOTINITIALISED  //在使用此API之前应成功调用WSAStartup()

WSAENETDOWN //Windows套接口实现检测到网络子系统失效

WSAEFAULT  //namelen参数不够大

WSAEINPROGRESS       //一个阻塞的Windows套接口调用正在进行中

WSAENOTSOCK   //描述字不是一个套接口

getsockname()函数用于获取一个套接口的协议地址,它用于一个已绑定或已连接套接口。本调用特别适用于如下情况:未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。在返回时,namelen参数包含了名字的实际字节数。

若一个套接口与INADDR_ANY绑定,即该套接口可以用任意的主机地址,此时除非调用connect()或accept()来连接,否则getsockname()将不会返回主机IP地址的任何信息。

除非套接口被连接,Windows套接口应用程序不应假设IP地址会从INADDR_ANY编程其他地址。这是因为对于一个有多个IP地址的主机来说,除非套接口被连接,否则该套接口所用的IP地址是不可知的(即不能确定是哪一个)。

 

4)根据主机名取得主机信息---gethostbyname()或WSAAsyncGetHostByName()

这两个Winsock API函数从主机数据库取回与指定的主机名对应的主机信息。这两个函数均返回一个hostent结构型的变量:

typedef struct hostent {

  char FAR      *h_name; //正式的主机名

  char FAR  FAR **h_aliases; //二维字符指针,返回一台主机的所有别名(即别名列表)

  short         h_addrtype; //主机地址类型,如AF_INET表示IPv4地址

  short         h_length; //可以返回主机地址的字节数

  char FAR  FAR **h_addr_list; //返回一台主机的所有IP地址。这个数组中的每个地址都是

//按网络字节顺序返回的。一般情况下,应用程序都采用该数组的第一个地址。

//但是如果返回的地址不止一个,应用程序就会相应地选择一个最恰当的地址,

//而不是一直都用第一个地址

} HOSTENT, *PHOSTENT, FAR *LPHOSTENT;

 

在Winsock1中提供的gethostbyname()函数格式如下:

struct hostent* FAR gethostbyname(

  __in  const char *name //一个指向主机名的指针

);

 

在Winsock1中提供的异步扩展WSAAsyncGetHostByName()函数的格式是:

HANDLE WSAAsyncGetHostByName(

  __in   HWND hWnd, //一个窗口句柄,表示异步请求完成时,该窗口句柄应该收到一条消息

  __in   unsigned int wMsg, //当异步请求完成时,将要接收的消息

  __in   const char *name, //指向主机名的指针

  __out  char *buf, //接收hostent数据的数据区指针。该数据区必须大于hostent结构的大小,这是因为

         //Windows Sockets实现不仅要用该数据区容纳hostent结构,而且hostent结构的成员引用的所有

         //数据也要在该区域内。建议用户提供一个MAXGETHOSTSTRUCT字节大小的缓冲区

  __in   int buflen //buf的大小

);

 

调用成功,gethostbyname()函数返回hostent结构的指针,调用失败则返回一个空指针,调用WSAGetLastError()得到特定的错误代码:

WSANOTINITIALISED  //应用这个API前,必须成功调用WSAStartup()

WSAENETDOWN //Windows Sockets实现检测到了网络子系统的错误

WSAHOST_NOT_FOUND  //没有找到授权应答的主机

WSATRY_AGAIN   //没有找到非授权主机,或者服务器故障(SERVERFAIL)

WSANO_RECOVERY    //无法恢复的错误,如查询格式错误(FORMERR)、拒绝服务(REFUSED)

WSANO_DATA      //有效的名字,但没有关于请求类型的数据记录

WSAEINPROGRESS       //一个阻塞的Windows Sockets操作正在进行

WSAEINTR     //阻塞调用被WSACancelBlockingCall()取消了

 

WSAAsyncGetHostByName()函数是gethostbyname()函数的Windows异步扩展函数。所谓异步,指的是Windows Sockets的实现启动该操作后立即回到调用方,并传回一个异步任务句柄,应用程序可以用它来标识该操作。

当异步操作完成时,如果成功则将主机名和地址信息拷贝到buf缓冲区中,同时向句柄为hWnd的应用程序窗口发送一条消息(wMsg)。wParam参数包含了初次函数调用时返回的异步任务句柄,lParam的高16位包含着错误代码。

错误代码为0说明异步操作成功,在成功完成的情况下,提供给初始函数调用的缓冲区中包含额一个hostent结构。

错误代码为WSAENOBUFS,则说明初始调用时有buflen指出的缓冲区大小太小;在这种情况下,lParam的低16位提供所有信息所需的缓冲区大小。

错误代码和缓冲区大小应使用WSAGETASYNCERROR和WSAGETASYNCBUFLEN宏从lParam中取出。这两个宏定义为:

#define WSAGETASYNCBUFLEN(lParam)           LOWORD(lParam)

#define WSAGETASYNCERROR(lParam)            HIWORD(lParam)

使用这些宏可以最大限度的提供程序源代码的可移植性。

 

函数的返回值指出异步操作是否成功启动,注意它并不隐含操作本身成功与否。若操作成功,则WSAAsyncGetHostByName()返回一个HANDLE类型的非0值,它用来标识该异步请求任务的句柄。通过该句柄使用WSACancelAsyncRequest()函数可取消该操作,也可通过检查wParam消息参数,以匹配异步操作和完成消息。如果异步操作不能启动,WSAAsyncGetHostByName()返回一个0值,使用WSAGetLastError()得到下面错误代码:

WSANOTINITIALISED  //在使用本API前必须进行一次成功的WSAStartup()调用

WSAENETDOWN // Windows Sockets实现检测到了网络子系统的错误

WSAEINPROGRESS       //一个阻塞的Windows Sockets操作正在进行

WSAEWOULDBLOCK  //本异步操作此时由于Windows Sockets实现的资源或其他限制的制约而无法调度

 

在应用程序的窗口收到消息时可能会设置下列错误代码,它们可以通过WSAGETASYNCERROR宏从应答的消息lParam中取出:

WSAENETDOWN // Windows Sockets实现检测到了网络子系统的错误

WSAENOBUFS       //可用的缓冲区空间不足或没有

WSAHOST_NOT_FOUND  //未找到授权应答主机

WSATRY_AGAIN   //没有找到非授权主机,或者服务器故障(SERVERFAIL)

WSANO_RECOVERY    //不可恢复性错误

WSANO_DATA      //无请求类型的数据记录

 

实例代码如下:

#include <winsock2.h>

#include <ws2tcpip.h>

#include <stdio.h>

#include <windows.h>

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

 

int main(int argc, char **argv)

{

 

    //-----------------------------------------

    // Declare and initialize variables

    WSADATA wsaData;

    int iResult;

 

    DWORD dwError;

    int i = 0;

 

    struct hostent *remoteHost;

    char *host_name;

    struct in_addr addr;

 

    char **pAlias;

 

    // Validate the parameters

    if (argc != 2) {

        printf("usage: %s hostname/n", argv[0]);

        printf("  to return the IP addresses for the host/n");

        printf("       %s www.contoso.com/n", argv[0]);

        printf(" or/n");

        printf("       %s IPv4string/n", argv[0]);

        printf("  to return an IPv4 binary address for an IPv4string/n");

        printf("       %s 127.0.0.1/n", argv[0]);

        return 1;

    }

    // Initialize Winsock

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (iResult != 0) {

        printf("WSAStartup failed: %d/n", iResult);

        return 1;

    }

 

    host_name = argv[1];

 

    printf("Calling gethostbyname with %s/n", host_name);

    remoteHost = gethostbyname(host_name);

   

    if (remoteHost == NULL) {

        dwError = WSAGetLastError();

        if (dwError != 0) {

            if (dwError == WSAHOST_NOT_FOUND) {

                printf("Host not found/n");

                return 1;

            } else if (dwError == WSANO_DATA) {

                printf("No data record found/n");

                return 1;

            } else {

                printf("Function failed with error: %ld/n", dwError);

                return 1;

            }

        }

    } else {

        printf("Function returned:/n");

        printf("/tOfficial name: %s/n", remoteHost->h_name);

        for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {

            printf("/tAlternate name #%d: %s/n", ++i, *pAlias);

        }

        printf("/tAddress type: ");

        switch (remoteHost->h_addrtype) {

        case AF_INET:

            printf("AF_INET/n");

            break;

        case AF_NETBIOS:

            printf("AF_NETBIOS/n");

            break;

        default:

            printf(" %d/n", remoteHost->h_addrtype);

            break;

        }

        printf("/tAddress length: %d/n", remoteHost->h_length);

 

        i = 0;

        if (remoteHost->h_addrtype == AF_INET)

        {

            while (remoteHost->h_addr_list[i] != 0) {

                addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];

                printf("/tIP Address #%d: %s/n", i, inet_ntoa(addr));

            }

        }

        else if (remoteHost->h_addrtype == AF_NETBIOS)

        {  

            printf("NETBIOS address was returned/n");

        }  

    }

 

    return 0;

}

 

5)根据主机地址取得主机信息---gethostbyaddr()或WSAAsyncGetHostByAddr()

这两个函数可以根据主机的IP地址取得主机名和主机地址等信息。

在Winsock1中提供的gethostbyaddr()函数的格式是:

struct hostent* FAR gethostbyaddr(

  __in  const char *addr, //指向网络字节顺序地址的指针

  __in  int len, //地址的长度,如果是IPv4类型的地址,则该值是4

  __in  int type //地址类型,如AF_INET

);

 

在Winsock1中提供的异步扩展WSAAsyncGetHostByAddr()函数的格式是:

HANDLE WSAAsyncGetHostByAddr(

  __in   HWND hWnd, //窗口句柄,表示当异步请求完成时,该窗口句柄应该收到一个消息

  __in   unsigned int wMsg, //当异步请求完成后,将要接收的消息

  __in   const char *addr, //指向网络字节顺序地址的指针

  __in   int len, //地址的长度,如果是IPv4类型的地址,则该值是4

  __in   int type, //地址类型,如AF_INET

  __out  char *buf, //接收hostent数据的数据区指针

  __in   int buflen //buf的大小

);

 

返回信息同4)。

 

实例如下:

#include <winsock2.h>

#include <ws2tcpip.h>

#include <stdio.h>

 

int main(int argc, char **argv)

{

 

    //-----------------------------------------

    // Declare and initialize variables

    WSADATA wsaData;

    int iResult;

 

    DWORD dwError;

    int i = 0;

    int bIpv6 = 0;

 

    struct hostent *remoteHost;

    char *host_addr;

    struct in_addr addr = { 0 };

    IN6_ADDR addr6;

 

    char **pAlias;

 

    // Validate the parameters

    if (argc < 2) {

        printf("usage: %s 4 ipv4address/n", argv[0]);

        printf(" or/n");

        printf("usage: %s 6 ipv6address/n", argv[0]);

        printf("  to return the hostname/n");

        printf("       %s 4 127.0.0.1/n", argv[0]);

        printf("       %s 6 0::1/n", argv[0]);

        return 1;

    }

    // Validate parameters

    if (atoi(argv[1]) == 4)

        bIpv6 = 0;

    else if (atoi(argv[1]) == 6)

        bIpv6 = 1;

    else {

        printf("usage: %s 4 ipv4address/n", argv[0]);

        printf(" or/n");

        printf("usage: %s 6 ipv6address/n", argv[0]);

        printf("  to return the hostname/n");

        printf("       %s 4 127.0.0.1/n", argv[0]);

        printf("       %s 6 0::1/n", argv[0]);

        return 1;

    }

 

    // Initialize Winsock

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (iResult != 0) {

        printf("WSAStartup failed: %d/n", iResult);

        return 1;

    }

 

    host_addr = argv[2];

 

    printf("Calling gethostbyaddr with %s/n", host_addr);

    if (bIpv6 == 1) {

        {

            iResult = inet_pton(AF_INET6, host_addr, &addr6);

            if (iResult == 0) {

                printf("The IPv6 address entered must be a legal address/n");

                return 1;

            } else

                remoteHost = gethostbyaddr((char *) &addr6, 16, AF_INET6);

        }

    } else {

        addr.s_addr = inet_addr(host_addr);

        if (addr.s_addr == INADDR_NONE) {

            printf("The IPv4 address entered must be a legal address/n");

            return 1;

        } else

            remoteHost = gethostbyaddr((char *) &addr, 4, AF_INET);

    }

 

    if (remoteHost == NULL) {

        dwError = WSAGetLastError();

        if (dwError != 0) {

            if (dwError == WSAHOST_NOT_FOUND) {

                printf("Host not found/n");

                return 1;

            } else if (dwError == WSANO_DATA) {

                printf("No data record found/n");

                return 1;

            } else {

                printf("Function failed with error: %ld/n", dwError);

                return 1;

            }

        }

    } else {

        printf("Function returned:/n");

        printf("/tOfficial name: %s/n", remoteHost->h_name);

        for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {

            printf("/tAlternate name #%d: %s/n", ++i, *pAlias);

        }

        printf("/tAddress type: ");

        switch (remoteHost->h_addrtype) {

        case AF_INET:

            printf("AF_INET/n");

            break;

        case AF_INET6:

            printf("AF_INET6/n");

            break;

        case AF_NETBIOS:

            printf("AF_NETBIOS/n");

            break;

        default:

            printf(" %d/n", remoteHost->h_addrtype);

            break;

        }

        printf("/tAddress length: %d/n", remoteHost->h_length);

 

        if (remoteHost->h_addrtype == AF_INET) {

            while (remoteHost->h_addr_list[i] != 0) {

                addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];

                printf("/tIPv4 Address #%d: %s/n", i, inet_ntoa(addr));

            }

        } else if (remoteHost->h_addrtype == AF_INET6)

            printf("/tRemotehost is an IPv6 address/n");

    }

 

    return 0;

}

 

 

6)根据协议名取得主机协议信息---getprotobyname()或WSAAsyncGetProtoByName()

函数getprotobyname()和WSAAsyncGetProtoByName()可以根据协议名称返回对应的相关协议信息,它们都要使用一个与协议有关的结构:

typedef struct protoent {

  char FAR      *p_name; //正式协议名

  char FAR  FAR **p_aliases; //二维字符指针,返回一个协议的所有别名

  short         p_proto; //以主机字节顺序排列的协议号

} protoent;

 

在Winsock1中提供的getprotobyname()函数格式是:

struct PROTOENT* FAR getprotobyname(

  __in  const char *name //指向协议名的指针

);

 

在Winsock1中提供的异步扩展WSAAsyncGetProtoByName()函数格式是:

HANDLE WSAAsyncGetProtoByName(

  __in   HWND hWnd, //窗口句柄,表示当异步请求完成时,该窗口句柄应该收到一个消息

  __in   unsigned int wMsg, //当异步请求完成后,将要接收的消息

  __in   const char *name, //指向协议名的指针

  __out  char *buf, //接收protoent数据的缓冲区指针

  __out  int buflen //buf的大小

);

返回信息类似WSAAsyncGetHostByName()。

 

7)根据协议号取得主机协议信息---getprotobynumber()或WSAAsyncGetProtoByNumber()

这两个函数返回对应于给定协议号的相关协议信息。

在Winsock1中提供的getprotobynumber()函数的格式是:

struct PROTOENT* FAR getprotobynumber(

  __in  int number //一个以主机字节顺序排列的协议号

);

 

在Winsock1中提供的异步扩展WSAAsyncGetProtoByNumber()函数的格式是:

HANDLE WSAAsyncGetProtoByNumber(

  __in   HWND hWnd,

  __in   unsigned int wMsg,

  __in   int number, //一个以主机字节顺序排列的协议号

  __out  char *buf,

  __in   int buflen

);

 

8)根据服务名取得相关服务信息---getservbyname()或WSAAsyncGetServByName()

这两个函数用于返回对应于给定服务名和协议名的相关服务信息,它们都用到如下的结构:

typedef struct servent {

  char FAR      *s_name; //正式的服务名

  char FAR  FAR **s_aliases; //所有其他的可选服务别名

  short         s_port; //连接该服务时需要用到的端口号,返回的端口号是以网络字节顺序排列的

  char FAR      *s_proto; //连接该服务时用到的协议名

} SERVENT, *PSERVENT, FAR *LPSERVENT;

 

在Winsock1中提供的getservbyname()函数格式是:

struct servent* FAR getservbyname(

  __in  const char *name, //一个指向服务名的指针

  __in  const char *proto //指向协议名的指针(可选)。如果这个指针为空,getservbyname()返回

         //第一个name与s_name或者某一个s_aliases匹配的服务条目。否则,getservbyname()对name

         //和proto都进行匹配

);

 

在Winsock1中提供的异步扩展WSAAsyncGetServByName()函数的格式是:

HANDLE WSAAsyncGetServByName(

  __in   HWND hWnd,

  __in   unsigned int wMsg,

  __in   const char *name,

  __in   const char *proto,

  __out  char *buf,

  __in   int buflen

);

 

9)根据端口号取得相关服务信息---getservbyport()或WSAAsyncGetServByPort()

这两个函数用于返回对应于给定端口号和协议名的相关服务信息。

在Winsock1中提供的getservbyport()函数的格式是:

struct servent* FAR getservbyport(

  __in  int port, //给定的端口号,以网络字节顺序排列

  __in  const char *proto //指向协议名的指针(可选)。如果这个指针为空,getservbyport()

         //返回第一个port与s_port匹配的服务条目;否则,getservbyport()对port和proto都进行匹配

);

 

在Winsock1提供的异步扩展WSAAsyncGetServByPort()函数的格式是:

HANDLE WSAAsyncGetServByPort(

  __in   HWND hWnd,

  __in   unsigned int wMsg,

  __in   int port,

  __in   const char *proto,

  __out  char *buf,

  __in   int buflen

);

 

 

 

Winsock_API_基本函数 立即下载

相关推荐

网络信息获取函数应用实例

本实例只使用了三个比较典型的函数,其他函数的用法与此类似。要说明的是,虽然这只是一个关于网络信息获取函数用法的实例,但该程序也是一个非常有用的实用程序,它可以获得一台主机的主机名、主机别名、主机ip地址列表等信息。

WinSock网络编程学习笔记(五):查询主机信息

WinSock编程-域名系统DNS初识、主机查询程序。这是学习笔记,欢迎大家交流!

Less Is More 2116

winsock 函数详解

Winsock在常见的Windows平台上有两个主要的版本,即Winsock1和Winsock2。编写与Winsock1兼容的程序你需要引用头文件WINSOCK.H,如果编写使用Winsock2的程序,则需要引用WINSOCK2.H。此外还有一个MSWSOCK.H头文件,它是专门用来支持在Windows平台上高性能网络程序扩展功能的。使用WINSOCK.H头文件时,同时需要库文件WSOCK32.LIB,使用WINSOCK2.H时,则需要WS2_32.LIB,如果使用MSWSOCK.H中的扩展API,则需要MSWSOCK.LIB。正确引用了头文件,并链接了对应的库文件,你就构建起编写WINSOCK网络程序的环境了。

winsock 常用函数介绍

Winsock 部分函数解析 注:本文综合了其他人的博客。 函数附表: accept() *  确认外来连接,并将它与一个立即建立的数据套接字联系起来。原始套接字返回到监听状态。 bind()  给未命名套接字赋一个本地名。 closesocket() *  从进程对象参考表中删...

额外zjs的博客 3650

Zemax实战:5步搞定牛顿望远镜光学设计(附球差优化技巧)

本文详细介绍了在Zemax OpticStudio中构建高精度牛顿望远镜光学系统的5步实战流程,包括初始参数设置、球差优化、折叠镜与遮光面配置等关键步骤。特别针对球差问题,提供了将主镜圆锥系数设为-1的优化方案,有效消除轴上弥散斑。通过3D视图和MTF分析验证,该系统可实现接近衍射极限的成像质量,适合天文观测等应用场景。

x8y9z0的博客 927

CameraLink接口详解:从引脚定义到信号传输

本文详细解析了CameraLink接口的物理连接与信号传输机制。从MDR26连接器的引脚定义与镜像关系入手,深入讲解了BASE与MEDIUM模式下的信号映射、LVDS差分传输原理,并强调了屏蔽层处理与端接电阻等关键硬件设计细节。文章结合实战经验,提供了常见图像传输问题的排查思路,是工业视觉领域高速图像传输的实用指南。

weixin_28318011的博客 888

获取网络信息

实验五 获取网络信息 一、 实验目的 掌握主要的Winsock信息查询函数的功能和用法。 掌握IP Helper API提供的主要功能和编程方法步骤。 二、实验内容 1.Winsock信息查询函数: (1)根据域名获取远程计算机的IP地址; (2)获取本机的IP地址。 2.使用IP Helper API获取本机的网络配置信息: (1)获取本机的MAC地址、IP地址、子网掩码等网络适配器信息。 (2)获取本地主机名、域名和DNS服务器信息。 (3)获取本地计算机IP地址表。 三、实验原理 (1) get

Sum 1934

Docker启动安装nacos(详情讲解,全网最细)

docker安装nacos保姆级教程

ilvjiale的博客 8万+

Winsock流程简述与函数用法说明

 一、Winsock流程简述1.基于面向连接的socket编程(TCP)      服务器端:      (1)创建套接字(socket)      (2)将套接字绑定到一个特定的IP和PORT      (3)将套接字设为监听模式,准备接受客户的请求(listen)      (4)准备客

wuhuwy的专栏 2263

多模态变体—ALIGN:高效的图像-文本学习

ALIGN 论文介绍了该模型的关键技术。无人工标注数据:使用互联网数据进行训练,不依赖人工清洗的数据集。高效的对比学习策略:采用大规模图像-文本配对数据,通过对比学习优化嵌入空间。支持零样本(zero-shot)学习:可以在没有专门训练的情况下执行多种任务,如分类、检索等。可扩展性强:ALIGN 采用高效的 CNN 或 Transformer 作为编码器,适用于大规模计算。

Azperk的博客 1218

别再傻傻分不清了!STM32定时器里Prescaler和ClockDivision到底有啥区别?

本文深入解析STM32定时器中Prescaler和ClockDivision的区别与应用场景。Prescaler作为定时器的'心跳调节器',决定计数频率;而ClockDivision则是输入捕获的'抗噪滤镜',有效抑制高频噪声。通过实战案例和示波器实测数据,帮助开发者避免常见配置误区,提升嵌入式系统稳定性。

weixin_29193259的博客 319

winsock进行网络开发首先需要了解下和winsock相关的函数

使用winsock进行网络开发首先需要了解下和winsock相关的函数及相关的参数每一个使用winsock进行网络开发的windows应用程序都必须包含Winsock.h(这是一个第二版本的winsock库)这个头文件。还需要包含一个静态库ws_32.lib。使用他们的时候需要对这个库进行一次初始化,使用完毕后要对该库进行释放。使用如下函数初始化ws2_32.dll动态链接库...

weixin_34113237的博客 183

功能安全实战系列09-英飞凌TC3xx LBIST开发详解

英飞凌Tricore/LBIST开发详解

initiallizer的博客 1103

java实现socket连接,向指定主机指定端口发送socket数据,并获取响应数据

全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现远程连接,在控制台输入命令,发送命令到远程主机执行,并获取响应数据测试代码 public static void main(String [] args) throws IOException { connect("192.168.8.102", 80); //即可在控制台输入命令,回

2万+

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析 ,人工智能,计算机视觉,大模型,AI,本文聚焦基于强化学习的目标检测与跟踪技术,先介绍相关技术基础,包括目标检测、跟踪及强化学习的算法等。接着阐述强化学习在目标检测与跟踪中的应用思路、框架及典型算法,解析三篇相关论文的背景、方法、实验结果。还探讨了该技术面临的样本效率、奖励函数设计等挑战,以及结合迁移学习等的未来发展方向,为该领域研究提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

2025_NIPS_Better Tokens for Better 3D: Advancing Vision-Language Modeling in 3D Medical Imaging

近年来,3D医学成像领域的视觉语言建模取得了显著进展,这得益于大规模带配对自由文本报告的计算机断层扫描(CT)语料库、更强大的架构以及高性能预训练模型。这些进展推动了自动报告生成和文本条件3D图像合成等应用的发展。然而,现有方法在处理高分辨率、长序列体积数据时仍面临挑战:对比预训练往往导致视觉编码器与临床语言错位,而基于切片的令牌化会模糊精细解剖结构,降低下游任务的诊断性能。

c_cpp_csharp的专栏 90

Java Socket之网络相关API

一、InetAddress 1. InetAddress类没有构造方法,所以不能直接new出一个对象; 可以通过InetAddress类的静态方法获得InetAddress的对象; InetAddress.getLocalHost(); InetAddress.getByName(); 2. 类主要方法: String - address.getHostName(); String

犁叔的博客 643

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

网络信息获取函数使用实例程序

#include<winsock2.h> #include<stdio.h> #include<stdlib.h> #pragma comment(lib, "ws2_32.lib") void main() { WSADATA wsaData; int n; //存放主机名称 char hostname[256]; ...

资资的博客 287

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

网络应用的Socket API编程的基本调用流程

在计算机OSI七层协议的顶层-应用层的网络应用中,Socket套接字编程使我们必须使用的技术,现在就记录一下套接字的网络编程的客户端服务器的调用流程;如下为基本流程图: 一、服务端 1.首先我们知道在客户端和服务器之间我们必须先开启服务器进程,以此来等待客户端的连接,所以我们先来看一下服务器的初始化流程: 1.1服务器调用WSAStartup()函数,来初始化套接字进程;int WSAStar

善水的博客 2796

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java网络通信

计算机网络实现了多个计算机互联系统,相互连接的计算机之间彼此能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序相互之间可以交换数据。而编写网络应用程序,首先必须明确网络应用程序所要使用的网络协议,TCP/IP协议是网络应用程序的首选。 1、网络程序设计基础 网络程序设计是指编写与其他计算机进行通信的程序。Java已经将网络程序所需要的东西封装成不同的类。只要创建这些类...

pan_junbiao的博客 2818

《ASCE1885的网络编程》---Winsock APIのIP地址转换函数

在进行网络程序设计时,常常需要从键盘上输入用点分十进制记法表示的主机IP地址,这种IP地址在程序中一般是用ASCII字符串的形式存储的。在网络程序中,要把这种用点分十进制字符串表示的IP地址转换为用网络字节顺序表示的IP地址。如果在程序中需要输出IP地址时,要把用二进制表示的网络字节顺序的IP地址转化为点分十进制形式表示的主机IP地址,用户才可以识别。在Winsock API中提供了这样的函数,这种函数以inet开头。1)点分十进制表示的IP地址转换为网络字节顺序的IP地址---inet_addr()Ine

ASCE1885 2417

《ASCE1885的网络编程》---IP数据报格式

IP协议提供不可靠无连接的数据报传输服务,IP层提供的服务是通过IP层对数据报的封装与拆封来实现的。IP数据报的格式分为报头区和数据区两大部分,其中报头区是为了正确传输高层数据而加的各种控制信息,数据区包括高层协议需要传输的数据。IP数据报的格式如下:注意,上图表示的数据,最高位在左边,记为0位;最低位在右边,记为31位。在网络中传输数据时,先传输0~7位,其次是8~15位,然后传输16~23位,最后传输24~31位。由于TCP/IP协议头部中所有的二进制数在网络中传输时都要求以这种顺序进行,因此把它称为网

ASCE1885 2248
上一篇: 《ASCE1885的网络编程》---Winsock APIのIP地址转换函数
下一篇: 《ASCE1885的武术》---断骨
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值