📄 socket.cxx
字号:
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
LOCK_SOCKET( fp );
ret = ops->getname( fp, sa, len, 0 );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
SOCKET_RETURN(ret);
}
// -------------------------------------------------------------------------
__externC int getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen)
{
SOCKET_ENTRY();
int ret = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
LOCK_SOCKET( fp );
ret = ops->getsockopt( fp, level, optname, optval, optlen );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
SOCKET_RETURN(ret);
}
// -------------------------------------------------------------------------
__externC int listen (int s, int len)
{
SOCKET_ENTRY();
int ret = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
LOCK_SOCKET( fp );
ret = ops->listen( fp, len );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
SOCKET_RETURN(ret);
}
// -------------------------------------------------------------------------
__externC ssize_t recvmsg (int s, struct msghdr *msg, int flags)
{
SOCKET_ENTRY();
ssize_t ret = 0;
int error = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
LOCK_SOCKET( fp );
msg->msg_flags = flags;
error = ops->recvmsg( fp, msg, NULL, &ret );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
if( error != ENOERR )
SOCKET_RETURN(error);
SOCKET_RETURN_VALUE( ret );
}
// -------------------------------------------------------------------------
__externC ssize_t recvfrom (int s, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen)
{
SOCKET_ENTRY();
struct msghdr msg;
struct iovec iov;
ssize_t ret = 0;
int error = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
// Set up a message header...
msg.msg_name = (caddr_t)from;
msg.msg_namelen = fromlen ? *fromlen : 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
iov.iov_base = buf;
iov.iov_len = len;
msg.msg_control = 0;
msg.msg_flags = flags;
LOCK_SOCKET( fp );
error = ops->recvmsg( fp, &msg, fromlen, &ret );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
if( error != ENOERR )
SOCKET_RETURN(error);
SOCKET_RETURN_VALUE( ret );
}
// -------------------------------------------------------------------------
__externC ssize_t recv (int s, void *buf, size_t len, int flags)
{
return recvfrom( s, buf, len, flags, NULL, NULL );
}
// -------------------------------------------------------------------------
__externC ssize_t sendmsg (int s, const struct msghdr *msg, int flags)
{
SOCKET_ENTRY();
ssize_t ret = 0;
int error = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
LOCK_SOCKET( fp );
error = ops->sendmsg( fp, msg, flags, &ret );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
if( error != ENOERR )
SOCKET_RETURN(error);
SOCKET_RETURN_VALUE( ret );
}
// -------------------------------------------------------------------------
__externC ssize_t sendto (int s, const void *buf,
size_t len, int flags, const struct sockaddr *to, socklen_t tolen)
{
SOCKET_ENTRY();
ssize_t ret = 0;
int error = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
struct msghdr msg;
struct iovec iov;
msg.msg_name = (caddr_t)to;
msg.msg_namelen = tolen;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = 0;
msg.msg_flags = 0;
iov.iov_base = (char *)buf;
iov.iov_len = len;
LOCK_SOCKET( fp );
error = ops->sendmsg( fp, &msg, flags, &ret );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
if( error != ENOERR )
SOCKET_RETURN(error);
SOCKET_RETURN_VALUE( ret );
}
// -------------------------------------------------------------------------
__externC ssize_t send (int s, const void *buf, size_t len, int flags)
{
return sendto( s, buf, len, flags, NULL, 0 );
}
// -------------------------------------------------------------------------
__externC int setsockopt (int s, int level, int optname,
const void *optval, socklen_t optlen)
{
SOCKET_ENTRY();
int ret = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
LOCK_SOCKET( fp );
ret = ops->setsockopt( fp, level, optname, optval, optlen );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
SOCKET_RETURN(ret);
}
// -------------------------------------------------------------------------
__externC int shutdown (int s, int how)
{
SOCKET_ENTRY();
int ret = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
LOCK_SOCKET( fp );
ret = ops->shutdown( fp, how );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
SOCKET_RETURN(ret);
}
//==========================================================================
// Locking protocol
static void cyg_ns_lock( cyg_nstab_entry *ns )
{
if( ns->syncmode & CYG_SYNCMODE_SOCK_NETSTACK )
{
nstab_lock[ns-&cyg_nstab[0]].lock();
}
}
static void cyg_ns_unlock( cyg_nstab_entry *ns )
{
if( ns->syncmode & CYG_SYNCMODE_SOCK_NETSTACK )
{
nstab_lock[ns-&cyg_nstab[0]].unlock();
}
}
static void cyg_sock_lock( cyg_file *fp )
{
cyg_nstab_entry *ns = (cyg_nstab_entry *)fp->f_mte;
if( fp->f_syncmode & CYG_SYNCMODE_SOCK_NETSTACK )
nstab_lock[ns-&cyg_nstab[0]].lock();
cyg_file_lock( fp, fp->f_syncmode>>CYG_SYNCMODE_SOCK_SHIFT);
}
static void cyg_sock_unlock( cyg_file *fp )
{
cyg_nstab_entry *ns = (cyg_nstab_entry *)fp->f_mte;
if( fp->f_syncmode & CYG_SYNCMODE_SOCK_NETSTACK )
nstab_lock[ns-&cyg_nstab[0]].unlock();
cyg_file_unlock( fp, fp->f_syncmode>>CYG_SYNCMODE_SOCK_SHIFT);
}
// -------------------------------------------------------------------------
// EOF socket.cxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -