孙鑫老师C++ 14课 代码问题

按照孙鑫老师的代码在我的电脑上运行后出现错误:TcpSrv.cpp运行到accept函数前就不在向后运行TcpClient.cpp接受到的recvBuf是一堆乱码这个是T... 按照孙鑫老师的代码
在我的电脑上运行后出现错误:

TcpSrv.cpp运行到accept函数前就不在向后运行
TcpClient.cpp接受到的recvBuf是一堆乱码

这个是 TcpSrv.cpp 的代码

#include <stdio.h>
#include <Winsock2.h>
#include <String.h>

void main()
{
//第一步:加载套接字库 WSAStartup 最终会对应WSACleanup 释放为该应用程序分配的资源
WORD wVersionRequsted; //版本请求
WSADATA wsaData; //WSADATA型对象
int err; //错误

wVersionRequsted = MAKEWORD(1,1);

err = WSAStartup(wVersionRequsted,&wsaData);
//如果加载错误
if(err != 0)
{
return ;
}
//如果加载版本错误
if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return ;
}

//创建套接字 socket
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
//绑定IP和端口 bind
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//将套接字设置为监听模式
listen(sockSrv,5);

SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);

//不断监听 并且与客户端交换信息
while(1)
{
//与客户端建立连接 accept
printf("*****************\n");
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
printf("*****************\n");
//发送数据 send
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.baidu.com",inet_ntoa(addrClient.sin_addr));
printf("%s\n",sendBuf);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);

//接受数据 recv
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);

getchar();
}

}

这个是 TcpClient.cpp 的代码

#include <stdio.h>
#include <Winsock2.h>
#include <String.h>

void main()
{
//第一步:加载套接字库 WSAStartup 最终会对应WSACleanup 释放为该应用程序分配的资源
WORD wVersionRequsted; //版本请求
WSADATA wsaData; //WSADATA型对象
int err; //错误

wVersionRequsted = MAKEWORD(1,1);

err = WSAStartup(wVersionRequsted,&wsaData);
//如果加载错误
if(err != 0)
{
return ;
}
//如果加载版本错误
if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return ;
}

//创建套接字 socket
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

//连接服务器端 connect
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);

connect(sockClient,(SOCKADDR*)&addrSrv,0);

char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
// char sendBuf[100];
send(sockClient,"hello the world",sizeof("hello the world")+1,0);

//关闭套接字
closesocket(sockClient);
//释放套接字库分配的资源
WSACleanup();
TcpSrv 运行结果:
**********************
TcpRecv 运行结果:
烫烫烫烫烫烫烫烫0
press any key to continue.
展开
 我来答
望穿秋水待伊人
2013-01-01 · TA获得超过644个赞
知道小有建树答主
回答量:708
采纳率:100%
帮助的人:799万
展开全部
accept是阻塞函数,运行到这个函数时程序会阻塞在这儿,等待客户端连接,如果没有客户端连接,会在这个函数这儿一直等待,所以你看起来就是卡在这儿。。

你说的乱码什么的我在调试模式下看到一些,不过那些是因为没有赋值成功,所以是一些乱码,程序有一个严重的错误,结果导致客户端连接不到服务端,注意看这一句connect(sockClient,(SOCKADDR*)&addrSrv,0); 第三个参数要求是第二个参数的长度,你设为0,后面的操作就都是错误的,所以客户端跟服务端没法交互 。应该改为connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)) 这样就OK了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式