1.sockaddr_in,in_addr
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
inet_addr("127.0.0.1"):将点分十进制形式转换为32位整数
inet_ntoa():和上面的功能正好相反,将整形数转换成点分十进制形式。
in_addr.sin_addr.s_addr=inet_addr("172.0.0.1");
printf("Address: %s\n", inet_ntoa(sa.sin_addr));
函数inet_addr的作用其实就是把"127.0.0.1"这样的字符串ip地址转换成0x0100007F这样的32位整数。 sin_addr其实是个4字节联合体,S_addr是它的int模式。 inet_ntoa接受的类型就是in_addr所以就直接传sin_addr了 上面的s和in其实分别代表socket和internet。
参考:http://zhidao.baidu.com/question/87513972.html
2.套接字连接基本结构:
int connect()
{
WSADATA wsadata;
struct sockaddr_in sock_addr;
HOSTENT *phostent;/*该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。*/
struct in_addr inaddr;
if(WSAStartup(MAKEWORD(1,1),&wsadata)<0)
{
//MessageBox(NULL,_T("WSAStartup Error!"),_T("connect() Error!"),MB_OK);
m_error=WSA_INIT_ERROR;
return m_error;
}
/*---------------根据域名获取网络地址,存放在struct in_addr中----------------*/
phostent=gethostbyname(m_server);//smtp.163.com
if(phostent!=NULL)
{
// lpAddr=phostent->h_addr_list[0];
memmove(&inaddr,phostent->h_addr_list[0],4);//220.181.12.101
}
else
{
//MessageBox(NULL,_T("gethostbyname Error!"),_T("connect() Error!"),MB_OK);
m_error=CONNECTSERVER_ERROR;
return m_error;
}
/*---------------根据域名获取网络地址,存放在struct in_addr中----------------*/
s=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);//SOCK_STREAM SOCK_DGRAM
sock_addr.sin_family=AF_INET;
sock_addr.sin_port=htons(m_port);
sock_addr.sin_addr=inaddr;//直接结构体赋值给结构体,或者写成:sock_addr.sin_addr.s_addr=inaddr.S_un.S_addr;
if(::connect(s,(struct sockaddr *)&sock_addr,sizeof(sock_addr)))
{
//MessageBox(NULL,_T("connect Error!"),_T("connect() Error!"),MB_OK);
m_error=CONNECT_ERROR;
return m_error;
}
return 0;
}
套接字发送接受信息基本结构:
int rcpttoCount = m_rcpttoList.size();
while(rcpttoCount>0)
{
sprintf(m_sendbuff,"%s%s%s","rcpt to:<",m_rcpttoList[--rcpttoCount].c_str(),">\r\n");
if(senddata()!=0)
{
return m_error;
}
if(recvdata()!=0)
{
return m_error;
}
if(strncmp(m_recvbuff,"250",3)!=NULL)
{
m_error=RCPT_TO_ERROR;
return m_error;
}
}
int senddata()
{
int idx = 0;
int csend;
int count;
if(m_sendCount==0)
count=strlen(m_sendbuff);
else
count=m_sendCount;
while(count>0)
{
if((csend=send(s,m_sendbuff+idx,count,0))==SOCKET_ERROR)
{
m_error =WSA_SEND_ERROR;
return 0;
}
if(csend==0)
{
break;
}
count-=csend;
idx+=csend;
}
if(m_sendCount!=0)
m_sendCount=0;
return 1;
}
int recvdata()
{
int crecv;
crecv=recv(s,m_recvbuff,MAX_LENGTH,0);
if(crecv==SOCKET_ERROR)
{
m_error = WSA_RECV_ERROR;
return 0;
}
else if(crecv==0)
{
m_error = WSA_RECV_ERROR;
return 0;
}
else
{
}
return 1;
}