socket编程:accept()函数详解
⽂章⽬录
1. 函数原型
accept函数允许在套接字上进⾏传⼊连接尝试。
SOCKET WSAAPI accept(
SOCKET s,
sockaddr *addr,
int*addrlen
);
listen监听客户端来的链接,accept将客户端的信息绑定到⼀个socket上,也就是给客户端创建⼀个socket,通过返回值返回给我们客户端的socket。
⼀次只能创建⼀个,有⼏个客户端链接,就要调⽤⼏次。
2. 函数使⽤
#ifndef UNICODE
#define UNICODE
#endif
#include<winsock2.h>
#include<stdio.h>
#include<windows.h>
// 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: %ld\n", iResult);
银厂沟旅游风景区
return1;
}
//----------------------
// 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: %ld\n",WSAGetLastError());
WSACleanup();
香露return1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in rvice;
rvice.sin_family = AF_INET;
rvice.sin_addr.s_addr =inet_addr("127.0.0.1");
rvice.sin_port =htons(27015);
if(bind(ListenSocket,
(SOCKADDR *)& rvice,sizeof(rvice))== SOCKET_ERROR){
(SOCKADDR *)& rvice,sizeof(rvice))== SOCKET_ERROR){
wprintf(L"bind failed with error: %ld\n",WSAGetLastError());
回家的路孩子你别忘closocket(ListenSocket);
WSACleanup();
return1;
}
/
遥远的天国/----------------------
// Listen for incoming connection requests.
// on the created socket
if(listen(ListenSocket,1)== SOCKET_ERROR){
wprintf(L"listen failed with error: %ld\n",WSAGetLastError());
closocket(ListenSocket);
WSACleanup();
return1;
}
//----------------------
// Create a SOCKET for accepting incoming requests.
SOCKET AcceptSocket;
wprintf(L"Waiting for client \n");
//----------------------
// Accept the connection.
AcceptSocket =accept(ListenSocket,NULL,NULL);
if(AcceptSocket == INVALID_SOCKET){
wprintf(L"accept failed with error: %ld\n",WSAGetLastError());
closocket(ListenSocket);
WSACleanup();
return1;
}el
wprintf(L"Client connected.\n");平仓盈亏
// No longer need rver socket
closocket(ListenSocket);
WSACleanup();
return0;
}
3. 参数
SOCKET s:
⼀个描述符,⽤于标识已使⽤侦听功能置于侦听状态的套接字。 实际上,连接是通过accept返回的套接字建⽴的。
*sockaddr addr:
通信层已知的指向接收连接实体地址的缓冲区的可选指针。 addr参数的确切格式由创建sockaddr结构的套接字时建⽴的地址族确定。*int addrlen:
指向整数的可选指针,该整数包含addr参数指向的结构的长度。
4. 通过函数也可以得到客户端信息印象平遥
getpeername函数检索套接字连接到的对等⽅的地址。
int WSAAPI getpeername(
SOCKET s,
sockaddr *name,
int*namelen
);
5. 得到本地服务器信息
猪肉炒西葫芦getsockname函数检索套接字的本地名称。
int WSAAPI getsockname(
SOCKET s,
sockaddr *name,
int*namelen
);
6. 返回值
成功:
返回值就是给客户端包好的socket
与客户端通信就靠这个
失败:
返回INVALIE_SOCKET
通过WSAGetLastError()得到错误码
7. accept特点
唯命是从
阻塞、同步:这个函数是阻塞的,没有客户端连接,那就⼀直卡在这⼉等着。
多个链接:⼀次只能⼀个,5个就要5次循环