一个Connect 成功的套接字,能不能再去绑定,然后监听? 如果不能,怎么才能重复利用这个套接字? web服务器是怎么做的?

wd_6532 2004-12-19 05:08:56
创建套接字相对来说比较耗时.
...全文
814 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
wd_6532 2005-01-04
  • 打赏
  • 举报
回复
up
wd_6532 2004-12-31
  • 打赏
  • 举报
回复
唉!
poplau 2004-12-31
  • 打赏
  • 举报
回复
一般服务器有两个主要的socket,首先创建一个线程负责Listen,得到一个连接后重开一个线程负责该连接。
wd_6532 2004-12-31
  • 打赏
  • 举报
回复
up
wd_6532 2004-12-31
  • 打赏
  • 举报
回复
up
allenq 2004-12-30
  • 打赏
  • 举报
回复
楼主的意思是要用socket连接池吧?规定最多同时有N个连接,这些连接可以复用?
wd_6532 2004-12-30
  • 打赏
  • 举报
回复
to fisker0303:
linux的close,win的closesocket 之后,资源已经释放了,不能再用了.
wd_6532 2004-12-30
  • 打赏
  • 举报
回复
我的理解是:

accetpex的目的是
1 非阻塞
2 在客户端没有连接进来之前创建好通信套接字,并把它放入接受请求包中投递出去.
3 同时投递1000个acceptex,可以同时接受1000个连接.
否则,假如系统能预先接纳50个,只能处理完50个,再处理下50个.这就要在客户端等待的时候创建会话资源.
jackyoungcom 2004-12-30
  • 打赏
  • 举报
回复
AcceptEx 的目的不是干这个用的。楼主使用API之前,应该先理解提供这个API的思想。
fisker0303 2004-12-30
  • 打赏
  • 举报
回复
哎呀,看迷糊了。总之一句话,端口既然已经分发出去了,想复用就要close掉后再用,否则是绝对不行的。
也就是说,你也改变一个端口的连接行为,就必须把那个端口弄回到初始状态,否则对它的一切操作都是非法的。
wd_6532 2004-12-30
  • 打赏
  • 举报
回复
up
wd_6532 2004-12-30
  • 打赏
  • 举报
回复
to ljhnew:
acceptex不是非阻塞的难道是阻塞的吗?虽然他不是真正的接受一个连接请求,
但是相对与阻塞的accept和阻塞的wsaaccpet来说,accpetex不是绝对是非阻塞函数吗?
wd_6532 2004-12-30
  • 打赏
  • 举报
回复
to allenq:

差不多吧,不过我想复用的不是已经建立好的socket连接,而是socket套接字资源

(我为什么要加资源两个字吗,因为如果我说套接字,就又会有人站出来说,我其实是一个数字)
ljhnew 2004-12-30
  • 打赏
  • 举报
回复
AcceptEx 怎么是非阻塞呢?windows使用AcceptEx 是采用overlapped IO的模式,并且使用是往往使用Windows events 或 completion ports 来实现。如果你一定要使用,给你一个例子好好分析吧。

The following example uses the AcceptEx function using overlapped I/O and completion ports.



#include <stdio.h>
#include "winsock2.h"
#include "mswsock.h"

void main() {
//----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
HANDLE hCompPort;
LPFN_ACCEPTEX lpfnAcceptEx = NULL;
GUID GuidAcceptEx = WSAID_ACCEPTEX;
WSAOVERLAPPED olOverlap;

SOCKET ListenSocket, AcceptSocket;
sockaddr_in service;
char lpOutputBuf[1024];
int outBufLen = 1024;
DWORD dwBytes;

//----------------------------------------
// Initialize Winsock
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if( iResult != NO_ERROR )
printf("Error at WSAStartup\n");

//----------------------------------------
// Create a handle for the completion port
hCompPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, (u_long)0, 0 );

//----------------------------------------
// Create a listening socket
ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): ListenSocket\n");
WSACleanup();
return;
}

//----------------------------------------
// Associate the listening socket with the completion port
CreateIoCompletionPort((HANDLE)ListenSocket, hCompPort, (u_long)0, 0);

//----------------------------------------
// Bind the listening socket to the local IP address
// and port 27015
hostent* thisHost;
char* ip;
u_short port;
port = 27015;
thisHost = gethostbyname("");
ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);

service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(ip); service.sin_port = htons(port);

if ( bind( ListenSocket,(SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
printf("bind failed\n");
closesocket(ListenSocket);
return;
}

//----------------------------------------
// Start listening on the listening socket
if (listen( ListenSocket, 100 ) == SOCKET_ERROR) {
printf("error listening\n");
}
printf("Listening on address: %s:%d\n", ip, port);

//----------------------------------------
// Load the AcceptEx function into memory using WSAIoctl.
// The WSAIoctl function is an extension of the ioctlsocket()
// function that can use overlapped I/O. The function's 3rd
// through 6th parameters are input and output buffers where
// we pass the pointer to our AcceptEx function. This is used
// so that we can call the AcceptEx function directly, rather
// than refer to the Mswsock.lib library.
WSAIoctl(ListenSocket,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidAcceptEx,
sizeof(GuidAcceptEx),
&lpfnAcceptEx,
sizeof(lpfnAcceptEx),
&dwBytes,
NULL,
NULL);

//----------------------------------------
// Create an accepting socket
AcceptSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (AcceptSocket == INVALID_SOCKET) {
printf("Error creating accept socket.\n");
WSACleanup();
return;
}

//----------------------------------------
// Empty our overlapped structure and accept connections.
memset(&olOverlap, 0, sizeof(olOverlap));

lpfnAcceptEx(ListenSocket,
AcceptSocket,
lpOutputBuf,
outBufLen - ((sizeof(sockaddr_in) + 16) * 2),
sizeof(sockaddr_in) + 16,
sizeof(sockaddr_in) + 16,
&dwBytes,
&olOverlap);

//----------------------------------------
// Associate the accept socket with the completion port
CreateIoCompletionPort((HANDLE)AcceptSocket, hCompPort, (u_long)0, 0);

//----------------------------------------
// Continue on to use send, recv, TransmitFile(), etc.,.
...

}


wd_6532 2004-12-29
  • 打赏
  • 举报
回复
up
ljhnew 2004-12-28
  • 打赏
  • 举报
回复
针对AcceptEx function [Winsock],我们一般不提倡使用,它是Windows独有的,并不是socket的标准调用,微软在它的MSDN中确实说过,在WIN32中使用AcceptEx 要比accept 相对要快,但在每次该使用它之前,必须调用GetAcceptExSockaddrs来做初始化工作(包括data, local socket address, and remote socket address),调用需要Windows Sockets 2支持,使用起来相当麻烦,尤其是在管理大量使用socket时,你不得不走很多弯路,其效率未必就比标准调用高。如果你真的坚持要用这些,等到做了很多工作后,说不定回头你会发现还不如一开始就用标准的系统调用,特别是兼容POSIX标准,当开发到一定程度,在考虑到程序移植工作时,就更显显出标准使用的必要性。

AcceptEx 详细请参考:
ms-help://MS.MSDNQTR.2004OCT.1033/winsock/winsock/acceptex_2.htm
Requirements系统需求
Client: Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 3.51 and later.
Server: Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server 3.51 and later.
Header: Declared in Mswsock.h.
Library: Use Mswsock.lib.


See Also
sharkhuang 2004-12-27
  • 打赏
  • 举报
回复
为什么要这样呢?我想知道你的需求
wd_6532 2004-12-27
  • 打赏
  • 举报
回复
up
wd_6532 2004-12-27
  • 打赏
  • 举报
回复
up
ProgrameMan 2004-12-26
  • 打赏
  • 举报
回复
我个人的看法是不可以,因为如果搂主说的的确是TCP套接字的话,那么在TCP得Connect 过程中,两端的套接字会进行相关的握手操作在这个过程中他们会协商很多信息,这些信息是两个特定套接字相互识别的信息,记得在哪本书中看过,TCP的实现中要具有如下特性,能够保证在一定时间内的突然断开后还能继续通讯(好像是5分钟),因此这就需要两端都能够在异常"断开"后还能够继续识别对方。

个人看法,不知道对不对
加载更多回复(37)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧