mirror of
https://github.com/stefanocasazza/ULib.git
synced 2025-09-28 19:05:55 +08:00
Update socket.cpp
This commit is contained in:
parent
4af46ce3f3
commit
c8e65baccf
|
@ -1173,6 +1173,7 @@ ok: setLocal();
|
|||
U_RETURN(false);
|
||||
}
|
||||
|
||||
#ifdef HAVE_EPOLL_WAIT
|
||||
bool USocket::beginAsynchronousConnect(const UString& server, unsigned int iServPort)
|
||||
{
|
||||
U_TRACE(1, "USocket::beginAsynchronousConnect(%V,%u)", server.rep, iServPort)
|
||||
|
@ -1199,28 +1200,37 @@ bool USocket::beginAsynchronousConnect(const UString& server, unsigned int iServ
|
|||
3) A TCP connection to 127.0.0.1 (localhost).
|
||||
*/
|
||||
|
||||
switch (U_FF_SYSCALL(connect, "%d,%p,%d", getFd(), (sockaddr*)cServer, cServer.sizeOf()))
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
iState = CONNECT;
|
||||
U_RETURN(true);
|
||||
}
|
||||
case -1:
|
||||
{
|
||||
if (errno == EINPROGRESS) U_RETURN(true);
|
||||
}
|
||||
default:
|
||||
{
|
||||
_close_socket();
|
||||
U_RETURN(false);
|
||||
}
|
||||
}
|
||||
int result = U_FF_SYSCALL(connect, "%d,%p,%d", getFd(), (sockaddr*)cServer, cServer.sizeOf());
|
||||
|
||||
if ( (result == -1 && errno == EINPROGRESS) || (result == 0 && finishAsynchronousConnect()) ) U_RETURN(true);
|
||||
|
||||
_close_socket();
|
||||
}
|
||||
|
||||
U_RETURN(false);
|
||||
}
|
||||
|
||||
bool USocket::finishAsynchronousConnect()
|
||||
{
|
||||
setBlocking();
|
||||
|
||||
uint32_t error = U_NOT_FOUND, tmp = sizeof(uint32_t);
|
||||
|
||||
(void)getSockOpt(SOL_SOCKET, SO_ERROR, (void*)&error, tmp);
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
iState = CONNECT;
|
||||
U_RETURN(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
iState = -(errno = error);
|
||||
U_RETURN(false);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int USocket::send(const char* pData, uint32_t iDataLen)
|
||||
{
|
||||
U_TRACE(1, "USocket::send(%p,%u)", pData, iDataLen)
|
||||
|
|
Loading…
Reference in New Issue
Block a user