00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "StdAfx.h"
00029 #include "CADatagramSocket.hpp"
00030 #include "CASocketAddrINet.hpp"
00031
00032
00033 #ifdef _DEBUG
00034 extern int sockets;
00035 #include "CAMsg.hpp"
00036 #endif
00037
00038 CADatagramSocket::CADatagramSocket()
00039 {
00040 m_Socket=0;
00041
00042 }
00043
00044 SINT32 CADatagramSocket::create()
00045 {
00046 return create(AF_INET);
00047 }
00048
00049
00050 SINT32 CADatagramSocket::create(int type)
00051 {
00052 if(m_Socket==0)
00053 m_Socket=::socket(type,SOCK_DGRAM,0);
00054 if(m_Socket==INVALID_SOCKET)
00055 return SOCKET_ERROR;
00056
00057 return E_SUCCESS;
00058 }
00059
00060 SINT32 CADatagramSocket::close()
00061 {
00062
00063
00064 int ret;
00065 if(m_Socket!=0)
00066 {
00067
00068
00069
00070
00071
00072 ::closesocket(m_Socket);
00073 #ifdef _DEBUG
00074 sockets--;
00075 #endif
00076 m_Socket=0;
00077 ret=0;
00078 }
00079 else
00080 ret=SOCKET_ERROR;
00081
00082 return ret;
00083 }
00084
00085
00086 SINT32 CADatagramSocket::bind(CASocketAddr & from)
00087 {
00088
00089 if(m_Socket==0&&create(from.getType())!=E_SUCCESS)
00090 return SOCKET_ERROR;
00091 if(::bind(m_Socket,from.LPSOCKADDR(),from.getSize())==SOCKET_ERROR)
00092 return SOCKET_ERROR;
00093 return E_SUCCESS;
00094 }
00095
00096 SINT32 CADatagramSocket::bind(UINT16 port)
00097 {
00098 CASocketAddrINet oSocketAddr(port);
00099 return bind(oSocketAddr);
00100 }
00101
00102 SINT32 CADatagramSocket::send(UINT8* buff,UINT32 len,CASocketAddr & to)
00103 {
00104 if(::sendto(m_Socket,(char*)buff,len,MSG_NOSIGNAL,to.LPSOCKADDR(),to.getSize())==SOCKET_ERROR)
00105 return E_UNKNOWN;
00106 return E_SUCCESS;
00107 }
00108
00109
00110 SINT32 CADatagramSocket::receive(UINT8* buff,UINT32 len,CASocketAddr* from)
00111 {
00112 int ret;
00113 if(from!=NULL)
00114 {
00115 socklen_t fromlen=from->getSize();
00116 ret=::recvfrom(m_Socket,(char*)buff,len,MSG_NOSIGNAL,(LPSOCKADDR)from,&fromlen);
00117 }
00118 else
00119 {
00120 ret=::recv(m_Socket,(char*)buff,len,MSG_NOSIGNAL);
00121 }
00122 return ret;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140