⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sock_linux_kernel.c

📁 基于sip协议的网络电话源码
💻 C
📖 第 1 页 / 共 2 页
字号:
PJ_DEF(pj_status_t) pj_sock_bind( pj_sock_t sockfd, 				  const pj_sockaddr_t *addr,				  int len){    long err;    mm_segment_t oldfs;    PJ_CHECK_STACK();    PJ_ASSERT_RETURN(addr!=NULL && len >= sizeof(struct pj_sockaddr),		     PJ_EINVAL);    oldfs = get_fs();    set_fs(KERNEL_DS);        err = sys_bind(sockfd, (struct sockaddr*)addr, len);    set_fs(oldfs);    if (err)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Bind socket. */PJ_DEF(pj_status_t) pj_sock_bind_in( pj_sock_t sockfd, 				     pj_uint32_t addr32,				     pj_uint16_t port){    pj_sockaddr_in addr;    PJ_CHECK_STACK();    addr.sin_family = PJ_AF_INET;    addr.sin_addr.s_addr = pj_htonl(addr32);    addr.sin_port = pj_htons(port);    return pj_sock_bind(sockfd, &addr, sizeof(pj_sockaddr_in));}/* * Close socket. */PJ_DEF(pj_status_t) pj_sock_close(pj_sock_t sockfd){    long err;    err = sys_close(sockfd);    if (err != 0)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Get remote's name. */PJ_DEF(pj_status_t) pj_sock_getpeername( pj_sock_t sockfd,					 pj_sockaddr_t *addr,					 int *namelen){    mm_segment_t oldfs;    long err;    PJ_CHECK_STACK();    oldfs = get_fs();    set_fs(KERNEL_DS);    err = sys_getpeername( sockfd, addr, namelen);    set_fs(oldfs);    if (err)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Get socket name. */PJ_DEF(pj_status_t) pj_sock_getsockname( pj_sock_t sockfd,					 pj_sockaddr_t *addr,					 int *namelen){    mm_segment_t oldfs;    int err;    PJ_CHECK_STACK();    oldfs = get_fs();    set_fs(KERNEL_DS);        err = sys_getsockname( sockfd, addr, namelen );    set_fs(oldfs);    if (err)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Send data */PJ_DEF(pj_status_t) pj_sock_send( pj_sock_t sockfd,				  const void *buf,				  pj_ssize_t *len,				  unsigned flags){    return pj_sock_sendto(sockfd, buf, len, flags, NULL, 0);}/* * Send data. */PJ_DEF(pj_status_t) pj_sock_sendto( pj_sock_t sockfd,				    const void *buff,				    pj_ssize_t *len,				    unsigned flags,				    const pj_sockaddr_t *addr,				    int addr_len){    long err;    mm_segment_t oldfs;    PJ_CHECK_STACK();    oldfs = get_fs();    set_fs(KERNEL_DS);        err = *len = sys_sendto( sockfd, (void*)buff, *len, flags, 			     (void*)addr, addr_len );    set_fs(oldfs);        if (err >= 0) {	return PJ_SUCCESS;    }    else {	return PJ_RETURN_OS_ERROR(-err);    }}/* * Receive data. */PJ_DEF(pj_status_t) pj_sock_recv( pj_sock_t sockfd,				  void *buf,				  pj_ssize_t *len,				  unsigned flags){    return pj_sock_recvfrom(sockfd, buf, len, flags, NULL, NULL);}/* * Receive data. */PJ_DEF(pj_status_t) pj_sock_recvfrom( pj_sock_t sockfd,				      void *buff,				      pj_ssize_t *size,				      unsigned flags,				      pj_sockaddr_t *from,				      int *fromlen){    mm_segment_t oldfs;    long err;    PJ_CHECK_STACK();    oldfs = get_fs();    set_fs(KERNEL_DS);    err = *size = sys_recvfrom( sockfd, buff, *size, flags, from, fromlen);    set_fs(oldfs);    if (err >= 0) {	return PJ_SUCCESS;    }    else {	return PJ_RETURN_OS_ERROR(-err);    }}/* * Get socket option. */PJ_DEF(pj_status_t) pj_sock_getsockopt( pj_sock_t sockfd,					pj_uint16_t level,					pj_uint16_t optname,					void *optval,					int *optlen){    mm_segment_t oldfs;    long err;    PJ_CHECK_STACK();    oldfs = get_fs();    set_fs(KERNEL_DS);    err = sys_getsockopt( sockfd, level, optname, optval, optlen);    set_fs(oldfs);    if (err)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Set socket option. */PJ_DEF(pj_status_t) pj_sock_setsockopt( pj_sock_t sockfd,					pj_uint16_t level,					pj_uint16_t optname,					const void *optval,					int optlen){    long err;    mm_segment_t oldfs;    PJ_CHECK_STACK();    oldfs = get_fs();    set_fs(KERNEL_DS);    err = sys_setsockopt( sockfd, level, optname, (void*)optval, optlen);    set_fs(oldfs);    if (err)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Shutdown socket. */#if PJ_HAS_TCPPJ_DEF(pj_status_t) pj_sock_shutdown( pj_sock_t sockfd,				      int how){    long err;    PJ_CHECK_STACK();    err = sys_shutdown(sockfd, how);    if (err)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Start listening to incoming connections. */PJ_DEF(pj_status_t) pj_sock_listen( pj_sock_t sockfd,				    int backlog){    long err;    PJ_CHECK_STACK();    err = sys_listen( sockfd, backlog );    if (err)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Connect socket. */PJ_DEF(pj_status_t) pj_sock_connect( pj_sock_t sockfd,				     const pj_sockaddr_t *addr,				     int namelen){    long err;    mm_segment_t oldfs;        PJ_CHECK_STACK();    oldfs = get_fs();    set_fs(KERNEL_DS);    err = sys_connect( sockfd, (void*)addr, namelen );    set_fs(oldfs);    if (err)	return PJ_RETURN_OS_ERROR(-err);    else	return PJ_SUCCESS;}/* * Accept incoming connections */PJ_DEF(pj_status_t) pj_sock_accept( pj_sock_t sockfd,				    pj_sock_t *newsockfd,				    pj_sockaddr_t *addr,				    int *addrlen){    long err;    PJ_CHECK_STACK();    PJ_ASSERT_RETURN(newsockfd != NULL, PJ_EINVAL);    err = sys_accept( sockfd, addr, addrlen);    if (err < 0) {	*newsockfd = PJ_INVALID_SOCKET;	return PJ_RETURN_OS_ERROR(-err);    }    else {	*newsockfd = err;	return PJ_SUCCESS;    }}#endif	/* PJ_HAS_TCP *//* * Permission to steal inet_ntoa() and inet_aton() as long as this notice below * is included: *//* * Copyright (c) 1983, 1993 *  The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *  This product includes software developed by the University of *  California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -