2 caihong tiankong caihong_tiankong 于 2015.07.13 18:28 提问

socket编程客户端连接失败

想用socket通信,没法解决客户端连接失败,代码是一本书上的实例,书上的都运行不成功吗,大家帮看下问题在那里,谢谢了图片说明
代码如下:
服务器端:###################################################
#include
#include /*引入winsock头文件*/

int main()
{
/*-----------------------------------------*/
/*------------定义变量---------------------*/
/*-----------------------------------------*/
char Sendbuf[100]; /*发送数据的缓冲区*/
char Receivebuf[100]; /*接受数据的缓冲区*/
int SendLen; /*发送数据的长度*/
int ReceiveLen; /*接收数据的长度*/
int Length; /*表示SOCKADDR的大小*/

SOCKET socket_server;   /*定义服务器套接字*/
SOCKET socket_receive;  /*定义用于连接套接字*/

SOCKADDR_IN Server_add; /*服务器地址信息结构*/
SOCKADDR_IN Client_add; /*客户端地址信息结构*/

WORD wVersionRequested; /*字(word):unsigned short*/
WSADATA wsaData;        /*库版本信息结构*/
int error;              /*表示错误*/

/*-----------------------------------------*/
/*------------初始化套接字库---------------*/
/*-----------------------------------------*/
/*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/
wVersionRequested = MAKEWORD( 2, 2 );   
/*加载套接字库,初始化Ws2_32.dll动态链接库*/
error = WSAStartup( wVersionRequested, &wsaData);   
if(error!=0)
{
    printf("加载套接字失败!");
    return 0;   /*程序结束*/
}
/*判断请求加载的版本号是否符合要求*/
if ( LOBYTE( wsaData.wVersion ) != 2 ||
    HIBYTE( wsaData.wVersion ) != 2 ) 
{   
    WSACleanup( );  /*不符合,关闭套接字库*/
    return 0;       /*程序结束*/
}

/*-----------------------------------------*/
/*------------设置连接地址-----------------*/
/*-----------------------------------------*/
Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/
Server_add.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/*主机地址*/
Server_add.sin_port=htons(5000);/*端口号*/

/*------------创建套接字-------------------*/
/*AF_INET表示指定地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议。*/
socket_server=socket(AF_INET,SOCK_STREAM,0);

/*-----------------------------------------*/
/*---绑定套接字到本地的某个地址和端口上----*/
/*-----------------------------------------*/
/*socket_server为套接字,(SOCKADDR*)&Server_add为服务器地址*/
if(bind(socket_server,(SOCKADDR*)&Server_add,sizeof(SOCKADDR) )==SOCKET_ERROR)
{
    printf("绑定失败\n");
}

/*-----------------------------------------*/
/*------------设置套接字为监听状态---------*/
/*-----------------------------------------*/
/*监听状态,为连接做准备,最大等待的数目为5*/
if(listen(socket_server,5)<0)
{
    printf("监听失败\n");
}

/*-----------------------------------------*/
/*------------接受连接---------------------*/
/*-----------------------------------------*/
Length=sizeof(SOCKADDR);
/*接受客户端的发送请求,等待客户端发送connect请求*/
socket_receive=accept(socket_server,(SOCKADDR*)&Client_add,&Length);
if(socket_receive==SOCKET_ERROR)
{
    printf("接受连接失败");
}

/*-----------------------------------------*/
/*--------------进行聊天-------------------*/
/*-----------------------------------------*/
while(1)                        /*无限循环*/
{   

    /*--------接收数据---------*/
    ReceiveLen =recv(socket_receive,Receivebuf,100,0);
    if(ReceiveLen<0)
    {
        printf("接收失败\n");
        printf("程序退出\n");
        break;
    }
    else
    {
        printf("client say: %s\n",Receivebuf);
    }   

    /*--------发送数据---------*/
    printf("please enter message:");
    scanf("%s",Sendbuf);
    SendLen=send(socket_receive,Sendbuf,100,0);
    if(SendLen<0)
    {
        printf("发送失败\n");
    }
}

/*-----------------------------------------*/
/*---------释放套接字,关闭动态库----------*/
/*-----------------------------------------*/
closesocket(socket_receive);    /*释放客户端的套接字资源*/
closesocket(socket_server);/*释放套接字资源*/
WSACleanup();/*关闭动态链接库*/
return 0;

}

客户端:#####################################################
#include
#include /*引入winsock头文件*/

int main()
{
/*-----------------------------------------*/
/*------------定义变量---------------------*/
/*-----------------------------------------*/
char Sendbuf[100]; /*发送数据的缓冲区*/
char Receivebuf[100]; /*接受数据的缓冲区*/
int SendLen; /*发送数据的长度*/
int ReceiveLen; /*接收数据的长度*/

SOCKET socket_send;             /*定义套接字*/

SOCKADDR_IN Server_add;         /*服务器地址信息结构*/

WORD wVersionRequested;         /*字(word):unsigned short*/
WSADATA wsaData;                /*库版本信息结构*/
int error;                      /*表示错误*/

/*-----------------------------------------*/
/*------------初始化套接字库---------------*/
/*-----------------------------------------*/
/*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/
wVersionRequested = MAKEWORD( 2, 2 );   
/*加载套接字库,初始化Ws2_32.dll动态链接库*/
error = WSAStartup( wVersionRequested, &wsaData);   
if(error!=0)
{
    printf("加载套接字失败!");
    return 0;                   /*程序结束*/
}
/*判断请求加载的版本号是否符合要求*/
if ( LOBYTE( wsaData.wVersion ) != 2 ||
    HIBYTE( wsaData.wVersion ) != 2 ) 
{   
    WSACleanup( );              /*不符合,关闭套接字库*/
    return 0;                   /*程序结束*/
}

/*-----------------------------------------*/
/*------------设置服务器地址---------------*/
/*-----------------------------------------*/
Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/
/*服务器的地址,将一个点分十进制表示为IP地址,inet_ntoa是将地址转成字符串*/
Server_add.sin_addr.S_un.S_addr = inet_addr("192.168.1.238");
Server_add.sin_port=htons(5000);/*端口号*/

/*-----------------------------------------*/
/*-------------进行连接服务器--------------*/
/*-----------------------------------------*/
/*客户端创建套接字,但是不需要绑定的,只需要和服务器建立起连接就可以了,*/
/*socket_sendr表示的是套接字,Server_add服务器的地址结构*/
socket_send=socket(AF_INET,SOCK_STREAM,0);

/*-----------------------------------------*/
/*-------------创建用于连接的套接字--------*/
/*-----------------------------------------*/
/*AF_INET表示指定地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议。*/
if(connect(socket_send,(SOCKADDR*)&Server_add,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
    printf("连接失败!\n");
}

/*-----------------------------------------*/
/*--------------进行聊天-------------------*/
/*-----------------------------------------*/
while(1)    /*无限循环*/
{   
    /*---------------发送数据过程----------*/
    printf("please enter message:");
    scanf("%s",Sendbuf);
    SendLen = send(socket_send,Sendbuf,100,0);      /*发送数据*/
    if(SendLen < 0)
    {
        printf("发送失败!\n");
    }

    /*--------------接收数据过程---------------*/
    ReceiveLen =recv(socket_send,Receivebuf,100,0); /*接受数据*/
    if(ReceiveLen<0)
    {
        printf("接收失败\n");
        printf("程序退出\n");
        break;
    }
    else
    {
        printf("Server say: %s\n",Receivebuf);
    }   
}

/*-----------------------------------------*/
/*---------释放套接字,关闭动态库----------*/
/*-----------------------------------------*/
closesocket(socket_send);/*释放套接字资源*/
WSACleanup();/*关闭动态链接库*/
return 0;

}

8个回答

oyljerry
oyljerry   Ds   Rxr 2015.07.13 18:50

connect 连接失败,你查看一下具体的错误信息。WSAGetLastError().

caihong_tiankong
caihong_tiankong 我查了是10060的错误,我现在不知道怎么解决了,希望你能给些指导,谢谢
2 年多之前 回复
dreamordream
dreamordream   2015.07.13 19:19

你试试将server绑定到具体的ip地址上看看

caihong_tiankong
caihong_tiankong 你说的具体怎么操作呢,我看到的服务器端都没有IP地址,谢谢了
2 年多之前 回复
caihong_tiankong
caihong_tiankong   2015.07.13 19:23

错语代码是19730812,我也没有百度出解决方法,我的打印错误的语句是在64行图片说明

caihong_tiankong
caihong_tiankong   2015.07.13 19:33

是10060错语
图片说明

oyljerry
oyljerry   Ds   Rxr 2015.07.13 19:51

WSAETIMEDOUT
10060
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

你服务端有没有启动,侦听的端口跟你客户端连接的端口是否一致

caihong_tiankong
caihong_tiankong 根据楼下的帮助,问题解决了,但是我还是想知道怎么查看服务器有没有启动,另外这个端口号的设置问题,刚接触这个,麻烦你啦
2 年多之前 回复
caihong_tiankong
caihong_tiankong 端口号是一致的,都是5000,不过这里的端口号是随意设置还是在cmd中查看
2 年多之前 回复
zuishikonghuan
zuishikonghuan   2015.07.13 20:30

本地通信的话服务器绑定的IP和客户端连接的IP都设置为127.0.0.1,这是主机回环地址,是一张虚拟网卡,每个系统都会有而且一般标准就是127.0.0.1,代表本机。

zuishikonghuan
zuishikonghuan 回复caihong_tiankong: 虚拟机的话,其实我没研究过,应该首先装好驱动,之后客户端那里用主机的虚拟机IP,额,就是虚拟机装好不是控制面板里网络共享中心里不是会多出来一个网络适配器吗,连接那个的IP
2 年多之前 回复
zuishikonghuan
zuishikonghuan 回复caihong_tiankong: 回环机制,简单说就是系统中的回环地址代表本机,复杂说,我们连接一个IP时,IP协议会进行“路由决策”,根据系统的路由表选择一条路由发送数据,如果没有确切的路由,就发送到默认路由,一般就是本地连接设置的“默认网关”,这个回环地址127.0.0.1就是路由表中的一个确切条目,这个条目就是把数据包发给了系统的回环虚拟网卡,按理说网卡应该把数据包发到链路上,但是这个回环虚拟网卡是操作系统虚拟出来的,它就是发回给本机,之所以有这个回环网卡,其实是有原因的,如果进行广播,根据定义主机自身也应该受到一份数据报文,如果没有这个回环网卡,主机自身就收不到了。简单理解回环地址就代表本机就行。
2 年多之前 回复
caihong_tiankong
caihong_tiankong 我只把客户端的IP绑定为127.0.0.1,就正常了,谢谢。不太理解这样的机制,或者说要把两个都绑定为回环地址,麻烦你再解释下了,非常感谢。如果我要在自己电脑上装的虚拟机上运行,使用虚拟机和自己的电脑实现通信,这个IP地址又改怎么设置。虚拟机做为客户端
2 年多之前 回复
CSDNXIAON
CSDNXIAON   2015.07.16 15:26

Linux socket编程入门及客户端服务器端通信实现 – 提高篇:TCP连接过程分析
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

caihong_tiankong
caihong_tiankong 谢谢,我学习下
2 年多之前 回复
Arnold9009
Arnold9009   2015.07.23 13:11

用netstat查看服务的端口是否开启,是否在监听

Csdn user default icon
上传中...
上传图片
插入图片