为了账号安全,请及时绑定邮箱和手机立即绑定

以下是关于accept()函数的一些问题,麻烦帮忙看看哦!

以下是关于accept()函数的一些问题,麻烦帮忙看看哦!

当年话下 2021-10-20 17:15:16
在TCP中,我用accept()函数与客户端建立了连接,并接受了一个套接字,但此后我想用accept与另一个用户建立连接,但不想用closesocket()关闭那个接收到的套接字,要怎么做才行!……也就是说我要怎么中断服务端与客户端的一个套接字的连接,而去连接另一个客户端的套接字,并在此后还能使用前一个客户端的套接字!就是SOCKET sockClient=accept(sockListen,(SOCKADDR*)&addrClient,&len);我想用sockListen来接受另一个用户的套接字,但又不想关闭套接字sockClient,要怎么办?
查看完整描述

2 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

accept()函数用于一个套接口接受一个连接。accept()是c语言中网络编程的重要的函数,windows系统在#include<winsock.h> ,而linux系统在#include <sys/socket.h>中。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数
sockfd:套接口描述字,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
实例:
#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 ;
}



查看完整回答
反对 回复 2021-10-24
?
PIPIONE

TA贡献1829条经验 获得超9个赞

客户端调用close()函数关闭socket对象,另客服端一个直接发起连接。因为accept()函数连接成功后,会还回一个新的文件描述符。

查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 362 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信