複製鏈接
請複製以下鏈接發送給好友

accept()

鎖定
accept()是在一個套接口接受的一個連接。accept()是c語言中網絡編程的重要的函數,本函數從s的等待連接隊列中抽取第一個連接,創建一個與s同類的新的套接口並返回句柄。
外文名
accept()
文件包含
#include
原    型
SOCKET accept()
返回值
失敗:INVALID_SOCKET

accept()表達式

SOCKET accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
參數
sockfd:套接字描述符,該套接口在listen()後監聽連接。
addr:(可選)指針,指向一緩衝區,其中接收為通訊層所知的連接實體的地址。Addr參數的實際格式由套接口創建時所產生的地址族確定。
addrlen:(可選)指針,輸入參數,配合addr一起使用,指向存有addr地址長度的整型數。

accept()例子

#ifndef UNICODE
    #defineUNICODE
#endif
#include <stdio.h>
#ifdef WIN32
#include <winsock2.h>
#include <windows.h>
//NeedtolinkwithWs2_32.lib
#pragmacomment(lib,"Ws2_32.lib")
#else
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#endif
int main(void)
{
    //----------------------
    //InitializeWinsock.
    WSADATAwsaData ;
    intiResult=WSAStartup(MAKEWORD(2,2),&wsaData);
    if(iResult!=NO_ERROR)
    {
        wprintf(L "WSAStartupfailedwitherror:%ld\n",iResult);
        return 1 ;
    }
    //----------------------
    //CreateaSOCKETforlisteningfor
    //incomingconnectionrequests.
    SOCKETListenSocket ;
    ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(ListenSocket==INVALID_SOCKET)
    {
        wprintf(L "socketfailedwitherror:%ld\n",WSAGetLastError());
        WSACleanup();
        return 1 ;
    }
    //----------------------
    //Thesockaddr_instructurespecifiestheaddressfamily,
    //IPaddress,andportforthesocketthatisbeingbound.
    sockaddr_inservice ;
    service.sin_family=AF_INET ;
    service.sin_addr.s_addr=inet_addr("127.0.0.1");
    service.sin_port=htons(27015);
    if(bind(ListenSocket,
    (SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
    {
        wprintf(L"bindfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    //----------------------
    //Listenforincomingconnectionrequests.
    //onthecreatedsocket
    if(listen(ListenSocket,1)==SOCKET_ERROR)
    {
        wprintf(L"listenfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    //----------------------
    //CreateaSOCKETforacceptingincomingrequests.
    SOCKETAcceptSocket ;
    wprintf(L "Waitingforclienttoconnect...\n");
    //----------------------
    //Accepttheconnection.
    AcceptSocket=accept(ListenSocket,NULL,NULL);
    if(AcceptSocket==INVALID_SOCKET)
    {
        wprintf(L "acceptfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    else 
    wprintf(L "Clientconnected.\n");
    //Nolongerneedserversocket
    closesocket(ListenSocket);
    WSACleanup();
    return 0 ;
}

accept()註釋

本函數從s的等待連接隊列中抽取第一個連接,創建一個與s同類的新的套接口並返回句柄。如果隊列中無等待連接,且套接口為阻塞方式,則accept()阻塞調用進程直至新的連接出現。如果套接口為非阻塞方式且隊列中無等待連接,則accept()返回一錯誤代碼。已接受連接的套接口不能用於接受新的連接,原套接口仍保持開放。
addr參數為一個返回參數,其中填寫的是為通訊層所知的連接實體地址。addr參數的實際格式由通訊時產生的地址族確定。addrlen參數也是一個返回參數,在調用時初始化為addr所指的地址空間;在調用結束時它包含了實際返回的地址的長度(用字節數表示)。該函數與SOCK_STREAM類型的面向連接的套接口一起使用。如果addr與addrlen中有一個為零NULL,將不返回所接受的套接口遠程地址的任何信息。
返回值:
如果沒有錯誤產生,則accept()返回一個描述所接受包的SOCKET類型的值。否則的話,返回INVALID_SOCKET錯誤,應用程序可通過調用WSAGetLastError()來獲得特定的錯誤代碼。
addrlen所指的整形數初始時包含addr所指地址空間的大小,在返回時它包含實際返回地址的字節長度。

accept()錯誤代碼

WSANOTINITIALISED:在使用此API之前應首先成功地調用WSAStartup()。
WSAENETDOWN:套接口實現檢測到網絡子系統失效。
WSAEFAULT:addrlen參數太小(小於socket結構的大小)。
WSAEINTR:通過一個WSACancelBlockingCall()來取消一個(阻塞的)調用。
WSAEINPROGRESS:一個阻塞的套接口調用正在運行中。
WSAEINVAL:在accept()前未激活listen()。
WSAEMFILE:調用accept()時隊列為空,無可用的描述字。
WSAENOBUFS:無可用緩衝區空間。
WSAENOTSOCK:描述字不是一個套接口。
WSAEOPNOTSUPP:該套接口類型不支持面向連接服務。
WSAEWOULDBLOCK:該套接口為非阻塞方式且無連接可供接受。
WSAECONNRESET:接受連接後在accept返回之前,被遠程客户端斷開連接。
參見: