📄 sock_bsd.c
字号:
int proto, pj_sock_t *sock){ PJ_CHECK_STACK(); /* Sanity checks. */ PJ_ASSERT_RETURN(sock!=NULL, PJ_EINVAL); PJ_ASSERT_RETURN((unsigned)PJ_INVALID_SOCKET==INVALID_SOCKET, (*sock=PJ_INVALID_SOCKET, PJ_EINVAL)); *sock = WSASocket(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED); if (*sock == PJ_INVALID_SOCKET) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}#else/* * Create new socket/endpoint for communication and returns a descriptor. */PJ_DEF(pj_status_t) pj_sock_socket(int af, int type, int proto, pj_sock_t *sock){ PJ_CHECK_STACK(); /* Sanity checks. */ PJ_ASSERT_RETURN(sock!=NULL, PJ_EINVAL); PJ_ASSERT_RETURN(PJ_INVALID_SOCKET==-1, (*sock=PJ_INVALID_SOCKET, PJ_EINVAL)); *sock = socket(af, type, proto); if (*sock == PJ_INVALID_SOCKET) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}#endif/* * Bind socket. */PJ_DEF(pj_status_t) pj_sock_bind( pj_sock_t sock, const pj_sockaddr_t *addr, int len){ PJ_CHECK_STACK(); PJ_ASSERT_RETURN(addr && len >= sizeof(struct sockaddr_in), PJ_EINVAL); if (bind(sock, (struct sockaddr*)addr, len) != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Bind socket. */PJ_DEF(pj_status_t) pj_sock_bind_in( pj_sock_t sock, pj_uint32_t addr32, pj_uint16_t port){ pj_sockaddr_in addr; PJ_CHECK_STACK(); SET_LEN(&addr, sizeof(pj_sockaddr_in)); addr.sin_family = PJ_AF_INET; pj_bzero(addr.sin_zero, sizeof(addr.sin_zero)); addr.sin_addr.s_addr = pj_htonl(addr32); addr.sin_port = pj_htons(port); return pj_sock_bind(sock, &addr, sizeof(pj_sockaddr_in));}/* * Close socket. */PJ_DEF(pj_status_t) pj_sock_close(pj_sock_t sock){ int rc; PJ_CHECK_STACK();#if defined(PJ_WIN32) && PJ_WIN32!=0 || \ defined(PJ_WIN32_WINCE) && PJ_WIN32_WINCE!=0 rc = closesocket(sock);#else rc = close(sock);#endif if (rc != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Get remote's name. */PJ_DEF(pj_status_t) pj_sock_getpeername( pj_sock_t sock, pj_sockaddr_t *addr, int *namelen){ PJ_CHECK_STACK(); if (getpeername(sock, (struct sockaddr*)addr, (socklen_t*)namelen) != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else { RESET_LEN(addr); return PJ_SUCCESS; }}/* * Get socket name. */PJ_DEF(pj_status_t) pj_sock_getsockname( pj_sock_t sock, pj_sockaddr_t *addr, int *namelen){ PJ_CHECK_STACK(); if (getsockname(sock, (struct sockaddr*)addr, (socklen_t*)namelen) != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else { RESET_LEN(addr); return PJ_SUCCESS; }}/* * Send data */PJ_DEF(pj_status_t) pj_sock_send(pj_sock_t sock, const void *buf, pj_ssize_t *len, unsigned flags){ PJ_CHECK_STACK(); PJ_ASSERT_RETURN(len, PJ_EINVAL); *len = send(sock, (const char*)buf, *len, flags); if (*len < 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Send data. */PJ_DEF(pj_status_t) pj_sock_sendto(pj_sock_t sock, const void *buf, pj_ssize_t *len, unsigned flags, const pj_sockaddr_t *to, int tolen){ PJ_CHECK_STACK(); PJ_ASSERT_RETURN(len, PJ_EINVAL); *len = sendto(sock, (const char*)buf, *len, flags, (const struct sockaddr*)to, tolen); if (*len < 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Receive data. */PJ_DEF(pj_status_t) pj_sock_recv(pj_sock_t sock, void *buf, pj_ssize_t *len, unsigned flags){ PJ_CHECK_STACK(); PJ_ASSERT_RETURN(buf && len, PJ_EINVAL); *len = recv(sock, (char*)buf, *len, flags); if (*len < 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Receive data. */PJ_DEF(pj_status_t) pj_sock_recvfrom(pj_sock_t sock, void *buf, pj_ssize_t *len, unsigned flags, pj_sockaddr_t *from, int *fromlen){ PJ_CHECK_STACK(); PJ_ASSERT_RETURN(buf && len, PJ_EINVAL); PJ_ASSERT_RETURN(from && fromlen, (*len=-1, PJ_EINVAL)); *len = recvfrom(sock, (char*)buf, *len, flags, (struct sockaddr*)from, (socklen_t*)fromlen); if (*len < 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else { RESET_LEN(from); return PJ_SUCCESS; }}/* * Get socket option. */PJ_DEF(pj_status_t) pj_sock_getsockopt( pj_sock_t sock, pj_uint16_t level, pj_uint16_t optname, void *optval, int *optlen){ PJ_CHECK_STACK(); PJ_ASSERT_RETURN(optval && optlen, PJ_EINVAL); if (getsockopt(sock, level, optname, (char*)optval, (socklen_t*)optlen)!=0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Set socket option. */PJ_DEF(pj_status_t) pj_sock_setsockopt( pj_sock_t sock, pj_uint16_t level, pj_uint16_t optname, const void *optval, int optlen){ PJ_CHECK_STACK(); if (setsockopt(sock, level, optname, (const char*)optval, optlen) != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Connect socket. */PJ_DEF(pj_status_t) pj_sock_connect( pj_sock_t sock, const pj_sockaddr_t *addr, int namelen){ PJ_CHECK_STACK(); if (connect(sock, (struct sockaddr*)addr, namelen) != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Shutdown socket. */#if PJ_HAS_TCPPJ_DEF(pj_status_t) pj_sock_shutdown( pj_sock_t sock, int how){ PJ_CHECK_STACK(); if (shutdown(sock, how) != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Start listening to incoming connections. */PJ_DEF(pj_status_t) pj_sock_listen( pj_sock_t sock, int backlog){ PJ_CHECK_STACK(); if (listen(sock, backlog) != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS;}/* * Accept incoming connections */PJ_DEF(pj_status_t) pj_sock_accept( pj_sock_t serverfd, pj_sock_t *newsock, pj_sockaddr_t *addr, int *addrlen){ PJ_CHECK_STACK(); PJ_ASSERT_RETURN(newsock != NULL, PJ_EINVAL);#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0 if (addr) { SET_LEN(addr, *addrlen); }#endif *newsock = accept(serverfd, (struct sockaddr*)addr, (socklen_t*)addrlen); if (*newsock==PJ_INVALID_SOCKET) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else { #if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0 if (addr) { RESET_LEN(addr); }#endif return PJ_SUCCESS; }}#endif /* PJ_HAS_TCP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -