我是靠谱客的博主 迅速太阳,最近开发中收集的这篇文章主要介绍socket编程--连接服务器(用IP地址或域名),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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地址或域名)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部