mirror of
https://github.com/Kiritow/GSock.git
synced 2024-03-22 13:10:51 +08:00
Fix sock api bug
This commit is contained in:
parent
ece0028d53
commit
78a37687d1
74
gsock.cpp
74
gsock.cpp
|
@ -22,9 +22,11 @@
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/// Using Win8.1
|
/// Using Win8.1
|
||||||
#define _WIN32_WINNT 0x0603
|
#define _WIN32_WINNT 0x0603
|
||||||
|
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma comment(lib,"ws2_32.lib")
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
@ -225,70 +227,76 @@ int sock::recv(void* Buffer,int MaxToRecv)
|
||||||
|
|
||||||
int sock::getsendtime(int& _out_Second, int& _out_uSecond)
|
int sock::getsendtime(int& _out_Second, int& _out_uSecond)
|
||||||
{
|
{
|
||||||
struct timeval outtime;
|
|
||||||
socklen_t _not_used_t;
|
|
||||||
int ret=getsockopt(_vp->sfd,SOL_SOCKET,SO_SNDTIMEO,(char*)&outtime,&_not_used_t);
|
|
||||||
if(ret<0) return ret;
|
|
||||||
/// We don't know why, but on Windows, 1 Second means 1000.
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
_out_Second=outtime.tv_sec/1000;
|
int result;
|
||||||
_out_uSecond=outtime.tv_usec;
|
socklen_t _not_used_t = sizeof(result);
|
||||||
|
int ret = getsockopt(_vp->sfd, SOL_SOCKET, SO_SNDTIMEO, (char*)&result, &_not_used_t);
|
||||||
|
if (ret<0) return ret;
|
||||||
|
_out_Second = result / 1000;
|
||||||
|
_out_uSecond = result % 1000;
|
||||||
#else
|
#else
|
||||||
_out_Second=outtime.tv_sec;
|
struct timeval outtime;
|
||||||
_out_uSecond=outtime.tv_usec;
|
socklen_t _not_used_t = sizeof(outtime);
|
||||||
|
int ret = getsockopt(_vp->sfd, SOL_SOCKET, SO_SNDTIMEO, (char*)&outtime, &_not_used_t);
|
||||||
|
if (ret<0) return ret;
|
||||||
|
_out_Second = outtime.tv_sec;
|
||||||
|
_out_uSecond = outtime.tv_usec;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sock::getrecvtime(int& _out_Second, int& _out_uSecond)
|
int sock::getrecvtime(int& _out_Second, int& _out_uSecond)
|
||||||
{
|
{
|
||||||
struct timeval outtime;
|
|
||||||
socklen_t _not_used_t;
|
|
||||||
int ret=getsockopt(_vp->sfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&outtime,&_not_used_t);
|
|
||||||
if(ret<0) return ret;
|
|
||||||
/// We don't know why, but on Windows, 1 Second means 1000.
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
_out_Second=outtime.tv_sec/1000;
|
int result;
|
||||||
_out_uSecond=outtime.tv_usec;
|
socklen_t _not_used_t = sizeof(result);
|
||||||
|
int ret = getsockopt(_vp->sfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&result, &_not_used_t);
|
||||||
|
if (ret<0) return ret;
|
||||||
|
_out_Second=result/1000;
|
||||||
|
_out_uSecond = result % 1000;
|
||||||
#else
|
#else
|
||||||
|
struct timeval outtime;
|
||||||
|
socklen_t _not_used_t = sizeof(outtime);
|
||||||
|
int ret = getsockopt(_vp->sfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&outtime, &_not_used_t);
|
||||||
|
if (ret<0) return ret;
|
||||||
_out_Second=outtime.tv_sec;
|
_out_Second=outtime.tv_sec;
|
||||||
_out_uSecond=outtime.tv_usec;
|
_out_uSecond=outtime.tv_usec;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sock::setsendtime(int Second)
|
int sock::setsendtime(int Second, int Millisecond)
|
||||||
{
|
{
|
||||||
struct timeval outtime;
|
|
||||||
/// We don't know why, but on Windows, 1 Second means 1000.
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
outtime.tv_sec=Second*1000;
|
int outtime = Second * 1000 + Millisecond % 1000;
|
||||||
outtime.tv_usec=0;
|
|
||||||
#else
|
#else
|
||||||
outtime.tv_sec=Second;
|
struct timeval outtime;
|
||||||
outtime.tv_usec=0;
|
outtime.tv_sec = Second;
|
||||||
|
outtime.tv_usec = Millisecond;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return setsockopt(_vp->sfd,SOL_SOCKET,SO_SNDTIMEO,(const char*)&outtime,sizeof(outtime));
|
return setsockopt(_vp->sfd,SOL_SOCKET,SO_SNDTIMEO,(const char*)&outtime,sizeof(outtime));
|
||||||
}
|
}
|
||||||
|
|
||||||
int sock::setrecvtime(int Second)
|
int sock::setrecvtime(int Second, int Millisecond)
|
||||||
{
|
{
|
||||||
struct timeval outtime;
|
|
||||||
/// We don't know why, but on Windows, 1 Second means 1000.
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
outtime.tv_sec=Second*1000;
|
int outtime = Second * 1000 + Millisecond % 1000;
|
||||||
outtime.tv_usec=0;
|
|
||||||
#else
|
#else
|
||||||
outtime.tv_sec=Second;
|
struct timeval outtime;
|
||||||
outtime.tv_usec=0;
|
outtime.tv_sec = Second;
|
||||||
|
outtime.tv_usec = Millisecond;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return setsockopt(_vp->sfd,SOL_SOCKET,SO_RCVTIMEO,(const char*)&outtime,sizeof(outtime));
|
return setsockopt(_vp->sfd,SOL_SOCKET,SO_RCVTIMEO,(const char*)&outtime,sizeof(outtime));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sock::setkeepalive(bool op)
|
||||||
|
{
|
||||||
|
int option = op ? 1 : 0;
|
||||||
|
return setsockopt(_vp->sfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&option, sizeof(option));
|
||||||
|
}
|
||||||
|
|
||||||
//forgive me, but writing code in hospital is really not a good experience.
|
//forgive me, but writing code in hospital is really not a good experience.
|
||||||
using _sock_getname_callback_t = decltype(getsockname);
|
using _sock_getname_callback_t = decltype(getsockname);
|
||||||
|
|
||||||
|
|
5
gsock.h
5
gsock.h
|
@ -62,8 +62,9 @@ public:
|
||||||
// GSOCK_API_ERROR
|
// GSOCK_API_ERROR
|
||||||
int getsendtime(int& _out_Second,int& _out_uSecond);
|
int getsendtime(int& _out_Second,int& _out_uSecond);
|
||||||
int getrecvtime(int& _out_Second,int& _out_uSecond);
|
int getrecvtime(int& _out_Second,int& _out_uSecond);
|
||||||
int setsendtime(int Second);
|
int setsendtime(int Second,int Millisecond);
|
||||||
int setrecvtime(int Second);
|
int setrecvtime(int Second,int Millisecond);
|
||||||
|
int setkeepalive(bool op);
|
||||||
|
|
||||||
// Return:
|
// Return:
|
||||||
// 0: Success. No Error. IPv4
|
// 0: Success. No Error. IPv4
|
||||||
|
|
|
@ -8,9 +8,11 @@
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/// Using Win8.1
|
/// Using Win8.1
|
||||||
#define _WIN32_WINNT 0x0603
|
#define _WIN32_WINNT 0x0603
|
||||||
|
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma comment(lib,"ws2_32.lib")
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user