|
@@ -42,7 +42,9 @@ typedef struct
|
42
|
42
|
unsigned recvCnt;
|
43
|
43
|
unsigned queCbCnt;
|
44
|
44
|
unsigned errCnt;
|
|
45
|
+ struct sockaddr_in sockaddr;
|
45
|
46
|
cmChar_t ntopBuf[ INET_ADDRSTRLEN+1 ]; // use INET6_ADDRSTRLEN for IPv6
|
|
47
|
+ cmChar_t hnameBuf[ HOST_NAME_MAX+1 ];
|
46
|
48
|
} cmUdp_t;
|
47
|
49
|
|
48
|
50
|
cmUdpH_t cmUdpNullHandle = cmSTATIC_NULL_HANDLE;
|
|
@@ -186,8 +188,6 @@ cmUdpRC_t cmUdpInit(
|
186
|
188
|
{
|
187
|
189
|
cmUdpRC_t rc;
|
188
|
190
|
|
189
|
|
- struct sockaddr_in addr;
|
190
|
|
-
|
191
|
191
|
cmUdp_t* p = _cmUdpHandleToPtr(h);
|
192
|
192
|
|
193
|
193
|
if((rc = _cmUdpFinal(p)) != kOkUdpRC )
|
|
@@ -200,11 +200,11 @@ cmUdpRC_t cmUdpInit(
|
200
|
200
|
return cmErrSysMsg(&p->err, kSockCreateFailUdpRC, errno, "Socket create failed." );
|
201
|
201
|
|
202
|
202
|
// create the local address
|
203
|
|
- if((rc = _cmUdpInitAddr(p, NULL, port, &addr )) != kOkUdpRC )
|
|
203
|
+ if((rc = _cmUdpInitAddr(p, NULL, port, &p->sockaddr )) != kOkUdpRC )
|
204
|
204
|
goto errLabel;
|
205
|
205
|
|
206
|
206
|
// bind the socket to a local address/port
|
207
|
|
- if( (bind( p->sockH, (struct sockaddr*)&addr, sizeof(addr))) == cmUdp_SYS_ERR )
|
|
207
|
+ if( (bind( p->sockH, (struct sockaddr*)&p->sockaddr, sizeof(p->sockaddr))) == cmUdp_SYS_ERR )
|
208
|
208
|
{
|
209
|
209
|
rc = cmErrSysMsg(&p->err,kSockBindFailUdpRC,errno,"Socket bind failed." );
|
210
|
210
|
goto errLabel;
|
|
@@ -287,6 +287,13 @@ cmUdpRC_t cmUdpFinal( cmUdpH_t h )
|
287
|
287
|
bool cmUdpIsValid( cmUdpH_t h )
|
288
|
288
|
{ return h.h != NULL; }
|
289
|
289
|
|
|
290
|
+const struct sockaddr_in* cmUdpLocalAddr( cmUdpH_t h )
|
|
291
|
+{
|
|
292
|
+ cmUdp_t* p = _cmUdpHandleToPtr(h);
|
|
293
|
+ return &p->sockaddr;
|
|
294
|
+}
|
|
295
|
+
|
|
296
|
+
|
290
|
297
|
|
291
|
298
|
cmUdpRC_t cmUdpConnect( cmUdpH_t h, const char* remoteAddr, cmUdpPort_t remotePort )
|
292
|
299
|
{
|
|
@@ -563,19 +570,18 @@ const cmChar_t* cmUdpAddrToString( cmUdpH_t h, const struct sockaddr_in* addr )
|
563
|
570
|
return p->ntopBuf;
|
564
|
571
|
}
|
565
|
572
|
|
566
|
|
-unsigned cmUdpHostNameMaxCharCount()
|
567
|
|
-{ return HOST_NAME_MAX+1; }
|
568
|
|
-
|
569
|
|
-cmUdpRC_t cmUdpHostName( cmChar_t* buf, unsigned bufByteCnt )
|
|
573
|
+const cmChar_t* cmUdpHostName( cmUdpH_t h )
|
570
|
574
|
{
|
571
|
|
- if( bufByteCnt > 0 )
|
572
|
|
- buf[0] = 0;
|
573
|
|
-
|
574
|
|
- if( bufByteCnt < cmUdpHostNameMaxCharCount() )
|
575
|
|
- return kBufTooSmallUdpRC;
|
|
575
|
+ cmUdp_t* p = _cmUdpHandleToPtr(h);
|
576
|
576
|
|
577
|
|
- if( gethostname(buf,bufByteCnt-1) != 0 )
|
578
|
|
- return kHostNameFailUdpRC;
|
|
577
|
+ _cmUdpClear_errno();
|
579
|
578
|
|
580
|
|
- return kOkUdpRC;
|
|
579
|
+ if( gethostname(p->hnameBuf,HOST_NAME_MAX) != 0 )
|
|
580
|
+ {
|
|
581
|
+ cmErrSysMsg(&p->err,kHostNameFailUdpRC,errno, "gethostname() failed." );
|
|
582
|
+ return NULL;
|
|
583
|
+ }
|
|
584
|
+
|
|
585
|
+ p->hnameBuf[HOST_NAME_MAX] = 0;
|
|
586
|
+ return p->hnameBuf;
|
581
|
587
|
}
|