00001 #include "socket.h"
00002
00003 namespace n2nc {
00004 namespace net {
00005
00006 Socket::Socket(int af,int type){
00007 this->m_af = af ;
00008 this->m_type = type ;
00009 this->m_fd = ::socket(af,type,0);
00010 if (this->m_fd == -1){
00011 N2NC_PRINT("socket()_error: %s\n",strerror(errno) );
00012 }
00013 this->m_buf_dirty = malloc(65535);
00014 }
00015
00016
00017
00018 Socket::Socket(){
00019 this->m_buf_dirty = malloc(65535);
00020 this->m_fd = -1 ;
00021 }
00022
00023 Socket::~Socket()
00024 {
00025 std::cerr << "close socket FD: " << this->m_fd << " freeing: " << this->m_buf_dirty << std::endl ;
00026 ::free(this->m_buf_dirty);
00027 this->close();
00028 }
00029
00030
00031 int Socket::getAddressFamily(){
00032 return this->m_af ;
00033 }
00034
00035
00036 int Socket::getFD() const {
00037 return this->m_fd ;
00038 }
00039
00040 int Socket::setSockOpt(int optname,bool value,int level){
00041 int val = (value ? 1 : 0 );
00042 return setsockopt(m_fd,level,optname,&val,sizeof(val));
00043 }
00044
00045 bool Socket::getSockOpt(int optname,int level){
00046 int val ;
00047 size_t val_len = sizeof(val);
00048 return getsockopt(m_fd,level,optname,&val,&val_len);
00049 }
00050
00051 int Socket::bind(SocketAddress &addr){
00052 this->setSockOpt(SO_REUSEADDR, true, SOL_SOCKET);
00053 int ret = ::bind(m_fd,addr.getRawSockAddr(),addr.getRawSockAddrLen());
00054 if (ret == -1){
00055 N2NC_PRINT("bind_error: %s\n",strerror(errno) );
00056 }
00057 return ret ;
00058 }
00059
00060 int Socket::open(SocketAddress &addr){
00061 int ret = ::connect(this->m_fd,addr.getRawSockAddr(),addr.getRawSockAddrLen());
00062 if (ret == -1){
00063 N2NC_PRINT("connect_error: %s\n",strerror(errno) );
00064 }
00065 return ret;
00066 }
00067
00068 int Socket::send(void *buf, size_t len){
00069 int ret = ::send(this->m_fd,buf,len,MSG_NOSIGNAL);
00070 if (ret == -1){
00071 N2NC_PRINT("send_error: %s\n",strerror(errno) );
00072 }
00073 return ret;
00074 }
00075
00076
00077 size_t Socket::recvCheck(){
00078 int ret ;
00079 ret = ::recv(this->m_fd,this->m_buf_dirty,65535,MSG_NOSIGNAL|MSG_DONTWAIT|MSG_PEEK);
00080 if (ret < 0){
00081 return 0 ;
00082 }else{
00083 return ret ;
00084 }
00085 }
00086
00087 int Socket::recv(void *buf, size_t len){
00088 int ret = ::recv(this->m_fd,buf,len,MSG_NOSIGNAL);
00089 if (ret == -1){
00090 N2NC_PRINT("recv_error: %s len: %d\n",strerror(errno),len );
00091 }
00092 return ret;
00093 }
00094
00095 int Socket::close(){
00096
00097 int ret = ::shutdown(this->m_fd, SHUT_RDWR);
00098 ret = ::close(this->m_fd);
00099 if (ret == -1){
00100 N2NC_PRINT("close_error: %s\n",strerror(errno) );
00101 }
00102 return ret;
00103 }
00104
00105 int n2nc::net::Socket::getType()
00106 {
00107 return this->m_type ;
00108 }
00109
00110 SocketAddress* Socket::getLocalSocketAddress() const{
00111 struct sockaddr_storage sa;
00112 size_t salen ;
00113 ::bzero(&sa,sizeof(struct sockaddr_storage));
00114
00115 switch(this->m_af){
00116 case (AF_INET):
00117 salen = sizeof(struct sockaddr_in);
00118 break;
00119
00120 case (AF_INET6):
00121 salen = sizeof(struct sockaddr_in6);
00122 break;
00123
00124 case (AF_UNIX):
00125 salen = sizeof(struct sockaddr_un);
00126 break;
00127 }
00128 if (::getsockname(this->m_fd,(struct sockaddr*)&sa,&salen)){
00129
00130 return NULL ;
00131 }
00132 return new SocketAddress((struct sockaddr*)&sa);
00133 }
00134
00135 SocketAddress* Socket::getRemoteSocketAddress() const{
00136 struct sockaddr_storage sa;
00137 size_t salen ;
00138 ::bzero(&sa,sizeof(struct sockaddr_storage));
00139
00140 switch(this->m_af){
00141 case (AF_INET):
00142 salen = sizeof(struct sockaddr_in);
00143 break;
00144
00145 case (AF_INET6):
00146 salen = sizeof(struct sockaddr_in6);
00147 break;
00148
00149 case (AF_UNIX):
00150 salen = sizeof(struct sockaddr_un);
00151 break;
00152 }
00153 if (::getpeername(this->m_fd,(struct sockaddr*)&sa,&salen)){
00154
00155 std::cerr << "getpeername error __LINE__" << strerror(errno) << this->m_fd << std::endl ;
00156 return NULL ;
00157 }
00158 return new SocketAddress((struct sockaddr*)&sa);
00159 }
00160
00161 bool Socket::isConnected(){
00162
00163 }
00164
00165 }
00166 }
00167
00168
00169
00170
00171
00172
00173