accept()

accept()

c語言中網絡編程的重要的函數
accept():在一個套接口接受一個連接。函數定義: #include int accept(int sockfd, void *addr, int *addrlen); sockfd 相當簡單,是和 listen() 中一樣的套接字描述符。addr 是個指向局部的數據結構 sockaddr_in 的指針。這是要求接入的信息所要去的地方(你可以測定那個地址在那個端口呼叫你)。在它的地址傳遞給 accept 之前,addrlen 是個局部的整形變量,設置為 sizeof(struct sockaddr_in)。accept 将不會将多餘的字節給 addr。如果你放入的少些,那麼它會通過改變 addrlen 的值反映出來。同樣,在錯誤時返回-1,并設置全局錯誤變量 errno。[1]
    中文名: 外文名:accept() 别名: 文件包含:#include 原型:SOCKET PASCAL FAR accept( SOCKET s, struct sockaddr FAR* 返回值:失敗返回-1

表達式簡介

在一個套接口接受一個連接。accept() 是c語言中網絡編程的重要的函數,windows系統在#include ,而linux系統在#include 中。

文件包含

#include 

原型

SOCKET PASCAL FAR accept( SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen);

參數

s:套接口描述字,該套接口在listen()後監聽連接。

addr:(可選)指針,指向一緩沖區,其中接收為通訊層所知的連接實體的地址。Addr參數的實際格式由套接口創建時所産生的地址族确定。

addrlen:(可選)指針,輸入參數,配合addr一起使用,指向存有addr地址長度的整型數。

例子

#ifndef UNICODE

#define UNICODE

#endif

#include 

#include 

#include 

// Need to link with Ws2_32.lib

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

int wmain(void)

{

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

// Initialize Winsock.

WSADATA wsaData;

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

if (iResult != NO_ERROR) {

wprintf(L"WSAStartup failed with error: %ldn", iResult);

return 1;

}

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

// Create a SOCKET for listening for

// incoming connection requests.

SOCKET ListenSocket;

ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (ListenSocket == INVALID_SOCKET) {

wprintf(L"socket failed with error: %ldn", WSAGetLastError());

WSACleanup();

return 1;

}

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

// The sockaddr_in structure specifies the address family,

// IP address, and port for the socket that is being bound.

sockaddr_in service;

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"bind failed with error: %ldn", WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1;

}

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

// Listen for incoming connection requests.

// on the created socket

if (listen(ListenSocket, 1) == SOCKET_ERROR) {

wprintf(L"listen failed with error: %ldn", WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1;

}

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

// Create a SOCKET for accepting incoming requests.

SOCKET AcceptSocket;

wprintf(L"Waiting for client to connect...n");

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

// Accept the connection.

AcceptSocket = accept(ListenSocket, NULL, NULL);

if (AcceptSocket == INVALID_SOCKET) {

wprintf(L"accept failed with error: %ldn", WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1;

} else

wprintf(L"Client connected.n");

// No longer need server socket

closesocket(ListenSocket);

WSACleanup();

return 0;

}

注釋

本函數從s的等待連接隊列中抽取第一個連接,創建一個與s同類的新的套接口并返回句柄。如果隊列中無等待連接,且套接口為非阻塞方式,則accept()阻塞調用進程直至新的連接出現。如果套接口為非阻塞方式且隊列中等待連接,則accept()返回一錯誤代碼。已接受連接的套接口不能用于接受新的連接,原套接口仍保持開放。

addr參數為一個返回參數,其中填寫的是為通訊層所知的連接實體地址。addr參數的實際格式由通訊時産生的地址族确定。addrlen參數也是一個返回參數,在調用時初始化為addr所指的地址空間;在調用結束時它包含了實際返回的地址的長度(用字節數表示)。該函數與SOCK_STREAM類型的面向連接的套接口一起使用。如果addr與addrlen中有一個為零NULL,将不返回所接受的套接口遠程地址的任何信息。

返回值

如果沒有錯誤産生,則accept()返回一個描述所接受包的SOCKET類型的值。否則的話,返回INVALID_SOCKET錯誤,應用程序可通過調用WSAGetLastError()來獲得特定的錯誤代碼。

 addrlen所指的整形數初始時包含addr所指地址空間的大小,在返回時它包含實際返回地址的字節長度。

成功返回一個新的套接字描述符,失敗返回-1。

錯誤代碼

 WSANOTINITIALISED:在使用此API之前應首先成功地調用WSAStartup()。

WSAENETDOWN:WINDOWS套接口實現檢測到網絡子系統失效。

WSAEFAULT:addrlen參數太小(小于socket結構的大小)。

WSAEINTR:通過一個WSACancelBlockingCall()來取消一個(阻塞的)調用。

WSAEINPROGRESS:一個阻塞的WINDOWS套接口調用正在運行中。

WSAEINVAL:在accept()前未激活listen()。

WSAEMFILE:調用accept()時隊列為空,無可用的描述字。

WSAENOBUFS:無可用緩沖區空間。

WSAENOTSOCK:描述字不是一個套接口。

WSAEOPNOTSUPP:該套接口類型不支持面向連接服務。

WSAEWOULDBLOCK:該套接口為非阻塞方式且無連接可供接受。

參見:

bind(), connect(), listen(), select(), socket(), WSAAsyncSelect().

上一篇:紅外線治療儀

下一篇:諾基亞515

相關詞條

相關搜索

其它詞條