gpeername.c
来自「用于嵌入式系统的TCP/IP协议栈」· C语言 代码 · 共 106 行
C
106 行
/***********************************************************************//* *//* Module: gpeername.c *//* Release: 2001.3 *//* Version: 99.0 *//* Purpose: getpeername() implementation *//* *//*---------------------------------------------------------------------*//* *//* Copyright 1999, Blunk Microsystems *//* ALL RIGHTS RESERVED *//* *//* Licensees have the non-exclusive right to use, modify, or extract *//* this computer program for software development at a single site. *//* This program may be resold or disseminated in executable format *//* only. The source code may not be redistributed or resold. *//* *//***********************************************************************/#include "../tcp_ipp.h"#include <string.h>/***********************************************************************//* Global Function Definitions *//***********************************************************************//***********************************************************************//* getpeername: Get port and IP address of connected peer *//* *//* Inputs: s = socket identifier *//* addrlen = sizeof(struct sockaddr_in) *//* *//* Output: *a = remote port and IP address *//* Returns: 0 if no errors, else -1 with errno set to error code *//* *//***********************************************************************/int getpeername(int s, void *a, int *addrlen){ SOCKET sock = &Socks[s - 1]; SockAddr addr; int rc = 0;#if OS_PARM_CHECK /*-------------------------------------------------------------------*/ /* Verify protocol has been initialized. */ /*-------------------------------------------------------------------*/ if (!Net.Initialized) { NetError(NULL, ENETDOWN); return -1; } /*-------------------------------------------------------------------*/ /* Check for valid socket ID. */ /*-------------------------------------------------------------------*/ if (InvalidHandle(s)) { NetError(NULL, ENOTSOCK); return -1; } /*-------------------------------------------------------------------*/ /* Verify sockaddr pointer and addrlen parameters. */ /*-------------------------------------------------------------------*/ if ((a == NULL) || (*addrlen != sizeof(struct sockaddr_in))) { NetError(sock, EFAULT); return -1; }#endif /*-------------------------------------------------------------------*/ /* Gain exclusive socket API access and stack internals access. */ /*-------------------------------------------------------------------*/ if (semPend(sock->api_access, WAIT_FOREVER)) { NetError(NULL, ENOTSOCK); return -1; } semPend(Net.IntSem, WAIT_FOREVER); /*-------------------------------------------------------------------*/ /* Verify socket is connected and output remote address and port. */ /*-------------------------------------------------------------------*/ if ((sock->flags & SF_CONNECTED) == FALSE) { NetError(sock, ENOTCONN); rc = -1; } else { memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = sock->remote.sin_port; addr.sin_addr = sock->remote.sin_addr; *(SockAddr *)a = addr; } /*-------------------------------------------------------------------*/ /* Release exclusive API and internals access and return result. */ /*-------------------------------------------------------------------*/ semPost(sock->api_access); semPost(Net.IntSem); return rc;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?