孙鑫老师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. 展开
在我的电脑上运行后出现错误:
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. 展开
1个回答
展开全部
accept是阻塞函数,运行到这个函数时程序会阻塞在这儿,等待客户端连接,如果没有客户端连接,会在这个函数这儿一直等待,所以你看起来就是卡在这儿。。
你说的乱码什么的我在调试模式下看到一些,不过那些是因为没有赋值成功,所以是一些乱码,程序有一个严重的错误,结果导致客户端连接不到服务端,注意看这一句connect(sockClient,(SOCKADDR*)&addrSrv,0); 第三个参数要求是第二个参数的长度,你设为0,后面的操作就都是错误的,所以客户端跟服务端没法交互 。应该改为connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)) 这样就OK了。
你说的乱码什么的我在调试模式下看到一些,不过那些是因为没有赋值成功,所以是一些乱码,程序有一个严重的错误,结果导致客户端连接不到服务端,注意看这一句connect(sockClient,(SOCKADDR*)&addrSrv,0); 第三个参数要求是第二个参数的长度,你设为0,后面的操作就都是错误的,所以客户端跟服务端没法交互 。应该改为connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)) 这样就OK了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询