2 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
accept()函數(shù)用于一個(gè)套接口接受一個(gè)連接。accept()是c語言中網(wǎng)絡(luò)編程的重要的函數(shù),windows系統(tǒng)在#include<winsock.h> ,而linux系統(tǒng)在#include <sys/socket.h>中。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
參數(shù)
sockfd:套接口描述字,該套接口在listen()后監(jiān)聽連接。
addr:(可選)指針,指向一緩沖區(qū),其中接收為通訊層所知的連接實(shí)體的地址。Addr參數(shù)的實(shí)際格式由套接口創(chuàng)建時(shí)所產(chǎn)生的地址族確定。
addrlen:(可選)指針,輸入?yún)?shù),配合addr一起使用,指向存有addr地址長度的整型數(shù)。
實(shí)例:
#ifndef UNICODE
#defineUNICODE
#endif
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#pragmacomment(lib,"Ws2_32.lib")
int wmain(void)
{
WSADATAwsaData ;
intiResult=WSAStartup(MAKEWORD(2,2),&wsaData);
if(iResult!=NO_ERROR)
{
wprintf(L "WSAStartupfailedwitherror:%ld\n",iResult);
return 1 ;
}
SOCKETListenSocket ;
ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(ListenSocket==INVALID_SOCKET)
{
wprintf(L "socketfailedwitherror:%ld\n",WSAGetLastError());
WSACleanup();
return 1 ;
}
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 ;
}
if(listen(ListenSocket,1)==SOCKET_ERROR)
{
wprintf(L"listenfailedwitherror:%ld\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1 ;
}
SOCKETAcceptSocket ;
wprintf(L "Waitingforclienttoconnect...\n");
AcceptSocket=accept(ListenSocket,NULL,NULL);
if(AcceptSocket==INVALID_SOCKET)
{
wprintf(L "accept failed with error:%ld\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1 ;
}
else
wprintf(L "Clientconnected.\n");
//Nolongerneedserversocket
closesocket(ListenSocket);
WSACleanup();
return 0 ;
}

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
客戶端調(diào)用close()函數(shù)關(guān)閉socket對象,另客服端一個(gè)直接發(fā)起連接。因?yàn)閍ccept()函數(shù)連接成功后,會還回一個(gè)新的文件描述符。
添加回答
舉報(bào)