accept

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dong1528313271/article/details/80868751
winsock.h:
SOCKET PASCAL FAR accept (
                          _In_ SOCKET s,
                          _Out_writes_bytes_opt_(*addrlen) struct sockaddr FAR *addr,
                          _Inout_opt_ int FAR *addrlen);
MSDN:
WINSOCK_API_LINKAGE SOCKET WSAAPI accept(
  SOCKET   s,
  sockaddr *addr,
  int      *addrlen
);

sockaddr *addr:
An optional pointer to a buffer that receives the address of the connecting entity, as known to the communications layer. The exact format of the addr parameter is determined by the address family that was established when the socket from the sockaddr structure was created.

1.可选(nullptr)
2.类型为sockaddr*

int* addrlen:
An optional pointer to an integer that contains the length of structure pointed to by the addr parameter.

1.可选(nullptr)
2.传入部位null那么*addrlen = sizeof(*addr);

注意:

msdn:
typedef struct sockaddr_in {
  short          sin_family;
  ADDRESS_FAMILY sin_family;
  USHORT         sin_port;
  IN_ADDR        sin_addr;
  CHAR           sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;

winsock.h
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};
typedef struct in_addr {
        union {
                struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { USHORT s_w1,s_w2; } S_un_w;
                ULONG S_addr;
        } S_un``

`此结构体的数据重点S_addr,即所谓的据据型地址数据

struct sockaddr {
        u_short sa_family;              /* address family */
        char    sa_data[14];            /* up to 14 bytes of direct address */
};

由于sockaddr内部填充没有sockaddr_in方便,我们使用sockaddr_in来替代

但两者可以相互转化


bind:
ISocket* TSocket::Accept(sockaddr_in *sdr, short port)
{
    sockaddr_in saddr = { 0 };
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(port);
    saddr.sin_addr.S_un.S_addr = INADDR_ANY;


    try{
        int retbind = bind(sock, (sockaddr*)&saddr, sizeof(saddr));
        if (SOCKET_ERROR == retbind)
            throw Except("call bind false, at TSocket.cpp cl: 43.86", GetLastError());


        //listen:
        int retlisten = listen(sock, LISTEN_MAX);
        if (0 != retlisten)
            throw Except("call listen false, at TSocket.cpp cl: 50.44");

        SOCKET client;
        int len = sizeof(*sdr);
        do{
            client = accept(sock, (sockaddr*)&sdr, &len);
            Except("",GetLastError()).what();
        } while (INVALID_SOCKET == client);

        return new TSocket(client);
        }
    catch (Except &e)
    {
        e.what();
        return NULL;
    }


}

猜你喜欢

转载自blog.csdn.net/dong1528313271/article/details/80868751