socket编程:accept()函数详解

更新时间:2023-07-19 09:32:12 阅读: 评论:0

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次循环

本文发布于:2023-07-19 09:32:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1104796.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:客户端   函数   连接   接字   指向   侦听
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图