概述
bool ThreadObject::checkIP(QString host)
{
//判断IP地址合法性
QStringList ipsplit = host.split('.');
//判断是否为111.111.111.111的形式
if(ipsplit.length() !=4)
return false;
for(int n=0;n<4;n++)
{
//判断每一段的数字范围(含非数字时,toInt也为0)
if(ipsplit[n].length()==0 || ipsplit[n].length()>3 || ipsplit[n].toInt()<0 || ipsplit[n].toInt()>255)
return false;
//判断是否都为数字
for(int m=0;m<ipsplit[n].length();m++)
{
if(!(ipsplit[n].at(m)>=QChar('0') && ipsplit[n].at(m)<=QChar('9')))
return false;
}
}
return true;
}
//使用gethostbyname 通过域名获知ip地址 / 直接使用IP地址
int ThreadObject::netConnect(const char *host,u_short port)
{
//加载套接字
WSADATA wsaData;
// Initialize Winsock
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR)
{
Print_DEBUG("[%s:%d] Failed to load Winsockn",__FUNCTION__,__LINE__);
return MOSQ_ERR_NO_CONN;
}
//判断是否为IP地址形式-true/域名形式-false
if(checkIP(QString(host)))
{
addrSrv.sin_family = AF_INET; //通信类型
addrSrv.sin_port = htons(port); //端口号 必须是网络字节顺序
addrSrv.sin_addr.S_un.S_addr = inet_addr(host); //Internet地址 必须是网络字节顺序 4字节的IP地址
Print_DEBUG("[%s:%d] 服务端 IP:%s,端口号:%dn",__FUNCTION__,__LINE__,host,port);
}else{
char IP[16] = {0};
struct hostent *hp;
hp = gethostbyname(host);
if (hp == NULL){
switch (h_errno)
{
case HOST_NOT_FOUND:
Print_DEBUG("[%s:%d] The host was not found.n",__FUNCTION__,__LINE__);
break;
case NO_ADDRESS:
Print_DEBUG("[%s:%d] The name is valid but it has no address.n",__FUNCTION__,__LINE__);
break;
case NO_RECOVERY:
Print_DEBUG("[%s:%d] A non-recoverable name server error occurred.n",__FUNCTION__,__LINE__);
break;
case TRY_AGAIN:
Print_DEBUG("[%s:%d]The name server is temporarily unavailable.n",__FUNCTION__,__LINE__);
break;
default:
Print_DEBUG("[%s:%d]defaultn",__FUNCTION__,__LINE__);
break;
}
return MOSQ_ERR_NO_CONN;
}
strcpy(IP, inet_ntoa(*(struct in_addr *)hp->h_addr_list[0]));
Print_DEBUG("[%s:%d] 服务端 IP:%s,端口号:%dn",__FUNCTION__,__LINE__,IP,port);
addrSrv.sin_family = AF_INET; //通信类型
addrSrv.sin_port = htons(port); //端口号 必须是网络字节顺序
addrSrv.sin_addr.S_un.S_addr = inet_addr(IP); //Internet地址 必须是网络字节顺序 4字节的IP地址
}
//创建套接字
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sockClient){
Print_DEBUG("[%s:%d] [ERR]Error at socket():%dn",__FUNCTION__,__LINE__,WSAGetLastError());
WSACleanup(); //释放套接字资源
return MOSQ_ERR_NO_CONN;
}
//向服务器发出连接请求
if(::connect(sockClient, (LPSOCKADDR)&addrSrv, sizeof(addrSrv)) == SOCKET_ERROR){
Print_DEBUG("[%s:%d] [ERR]unable to connect to server:%dn",__FUNCTION__,__LINE__,WSAGetLastError());
WSACleanup(); //释放套接字资源
return MOSQ_ERR_NO_CONN;
}
return MOSQ_ERR_SUCCESS;
}
注意: hp = gethostbyname(host);需在WSAStartup(MAKEWORD(2, 2), &wsaData)之后
最后
以上就是迅速太阳为你收集整理的socket编程--连接服务器(用IP地址或域名)的全部内容,希望文章能够帮你解决socket编程--连接服务器(用IP地址或域名)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复