49void FitDatagram(
int fd)
51 const int minSize = 65536;
56 if (!getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (
Sokdata_t)&curSize, &szLen)
57 && curSize >= minSize)
return;
58 setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (
Sokdata_t)&minSize,
sizeof(minSize));
76 {
if ((
FD = myNet.
Relay(dest)) < 0)
77 {
eDest->
Emsg(
"NetMsg",
"Unable to create UDP msg socket.");
79 }
else FitDatagram(
FD);
89 const char *eText = specDest.
Set(dest);
91 {
eDest->
Emsg(
"NetMsg",
"Default", dest,
"is unreachable");
92 if (aOK) *aOK =
false;
101 {
eDest->
Emsg(
"NetMsg",
"Unable to create UDP msg socket.");
102 if (aOK) *aOK =
false;
153 if (!Blen && !(Blen = strlen(Buff)))
return 0;
160 {
eDest->
Emsg(
"NetMsg",
"Destination not specified.");
return -1;}
165 }
while (retc < 0 && errno == EINTR);
174 if (specDest.
Set(dest))
175 {
eDest->
Emsg(
"NetMsg", dest,
"is unreachable");
return -1;}
177 if (tmo >= 0 && !
OK2Send(tmo, dest))
return 1;
181 while (retc < 0 && errno == EINTR);
183 return (retc < 0 ?
retErr(errno, specDest) : 0);
189 const char *Buff,
int Blen,
int tmo)
193 if (!Blen && !(Blen = strlen(Buff)))
return 0;
195 if (netSA.
Addr.sa_family == AF_INET) aSize =
sizeof(netSA.
v4);
196 else if (netSA.
Addr.sa_family == AF_INET6) aSize =
sizeof(netSA.
v6);
197 else return retErr(EAFNOSUPPORT, (dest ? dest :
"Unknown!"));
199 if (tmo >= 0 && !
OK2Send(tmo, dest))
return 1;
202 while (retc < 0 && errno == EINTR);
204 if (retc >= 0)
return 0;
205 return retErr(errno, (dest ? dest :
"Unknown!"));
211 const char *dest,
int tmo)
218 {
eDest->
Emsg(
"NetMsg",
"Destination not specified.");
return -1;}
229 if (specDest.
Set(dest))
230 {
eDest->
Emsg(
"NetMsg", dest,
"is unreachable");
return -1;}
234 struct msghdr mHdr{};
236 mHdr.msg_name = (
void*)specDest.
SockAddr();
237 mHdr.msg_namelen = specDest.
SockSize();
238 mHdr.msg_iov =
const_cast<struct iovec*
>(
iov);
239 mHdr.msg_iovlen = iovcnt;
243 if (tmo >= 0 && !
OK2Send(tmo, dest))
return 1;
247 do {retc = sendmsg(
FD, &mHdr, 0);}
while (retc < 0 && errno == EINTR);
251 return (retc < 0 ?
retErr(errno, specDest) : 0);
263 struct pollfd polltab = {
FD, POLLOUT|POLLWRNORM, 0};
266 do {retc = poll(&polltab, 1, timeout);}
while(retc < 0 && errno == EINTR);
268 if (retc == 0 || !(polltab.revents & (POLLOUT | POLLWRNORM)))
269 eDest->
Emsg(
"NetMsg",
"UDP link to", dest,
"is blocked.");
271 eDest->
Emsg(
"NetMsg",errno,
"poll", dest);
284 {
eDest->
Emsg(
"NetMsg",
"Destination not specified.");
return -1;}
287 eDest->
Emsg(
"NetMsg", ecode,
"send to", theDest);
288 return (EWOULDBLOCK == ecode || EAGAIN == ecode ? 1 : -1);
293 return retErr(ecode, theDest.
Name(
"unknown"));
const sockaddr * SockAddr()
const char * Name(const char *eName=0, const char **eText=0)
const char * Set(const char *hSpec, int pNum=PortInSpec)
int retErr(int ecode, const char *theDest)
int Send(const char *buff, int blen=0, const char *dest=0, int tmo=-1)
XrdNetMsg(XrdSysError *erp, const char *dest=0, bool *aOK=0, bool refr=false)
int OK2Send(int timeout, const char *dest)
static bool Register(XrdNetPeer &Peer)
static void UnRegister(int fd)
int Relay(XrdNetPeer &Peer, const char *dest, int opts=0)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)