孙鑫的第14课网络编程,为什么在VC6下好好的,在vs2010没得到想要的效果?

一鸣惊天 2011-10-31 12:27:34
两个工程的代码如下:(都是Win32 Console Application)

TCPSrv工程:

#include<WinSock2.h>
#include<stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}

SOCKET socketSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

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

listen(socketSrv,5);

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET socketConn=accept(socketSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100;
sprintf(sendBuf,"Welcome %s to http://www.ding.org",inet_ntoa(addrClient.sin_addr));
send(socketConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(socketConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(socketConn);
}
}


TCPClient工程:

#include<WinSock2.h>
#include<stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}

SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0);
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(socketClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf[100;
recv(socketClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(socketClient,"this is zhangsan",strlen("this is zhangsan")+1,0);

closesocket(socketClient);
WSACleanup();
}




我都包含了WS2_32.lib的。
在VS2010下,
先运行第一个工程,啥都没有。
第二个工程不断输出 烫烫烫(很多“烫”字)welcome 204.204.204.204 to http://www.ding.org 烫烫(很多烫)
这时,第一个工程依旧啥都没有。
...全文
450 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
moqi9 2014-04-21
  • 打赏
  • 举报
回复
我也出现类似问题了,看了楼上大神们的解答,表示已解决问题。#pragma comment(lib,"ws2_32.lib") 我没加这句,直接在 "项目"->"项目属性"->"配置属性"->链接器->输入->附加依赖项添加了 ;ws2_32.lib
moqi9 2014-04-21
  • 打赏
  • 举报
回复
我也出现类似问题了,看了楼上大神们的解答,表示已解决问题。#pragma comment(lib,"ws2_32.lib") 我没加这句,直接在 "项目"->"项目属性"->"配置属性"->链接器->输入->附加依赖项添加了 ;ws2_32.lib
hdlbuf 2014-02-25
  • 打赏
  • 举报
回复
哈哈,你们都回答什么啊。。。 我也碰到同样的问题,同样复制你的代码。 原因找到了! 多次启动服务器,第二个开始就一直出现那些字符了。 先启动服务器,然后启动客户端就可以了。 这个不可以同时开两个服务器的。。
  • 打赏
  • 举报
回复
不要在VS 上启动,在目录下启动.exe文件,先启动服务器端的,然后启动客户端的,这时结果是正确的。
谭墨墨快乐 2012-07-10
  • 打赏
  • 举报
回复
用vs2010生成的工程中,不要直接运行,你要在目录下启动.exe文件,想启动服务器端的,然后启动客户端的,这时结果是正确的。此时你会发现客户端很快会消失,在程序中添加Sleep()函数,让其停留一段时间。
ashengming 2011-11-08
  • 打赏
  • 举报
回复
同问~按照上面的步骤还是不行啊!
bazzi2011 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xhxingyi 的回复:]
引用 11 楼 dyongfly123 的回复:

vs2010下编译成功,代码直接拷贝楼主的,没有出现楼主说的出现很多“烫”字。
ws2_32.lib这个库和楼主添加的地方不一样:
#include<WinSock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")//多了一句这个

另外属性上 "项目"->"项目属性"……
[/Quote]

复制我8楼的代码,把下面这句去掉!8楼的代码我在vs2005上都调试正确了!

#pragma comment(lib,"ws2_32.lib")
dyongfly123 2011-11-01
  • 打赏
  • 举报
回复
57920702 QQ联系!
一鸣惊天 2011-11-01
  • 打赏
  • 举报
回复
受不了了
一鸣惊天 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dyongfly123 的回复:]

vs2010下编译成功,代码直接拷贝楼主的,没有出现楼主说的出现很多“烫”字。
ws2_32.lib这个库和楼主添加的地方不一样:
#include<WinSock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")//多了一句这个

另外属性上 "项目"->"项目属性"->"配置属性"->"常规"->"字符集",改为……
[/Quote]

不是吧,如你说的做了,我的怎么不行????
dyongfly123 2011-11-01
  • 打赏
  • 举报
回复
vs2010下编译成功,代码直接拷贝楼主的,没有出现楼主说的出现很多“烫”字。
ws2_32.lib这个库和楼主添加的地方不一样:
#include<WinSock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")//多了一句这个

另外属性上 "项目"->"项目属性"->"配置属性"->"常规"->"字符集",改为"使用多字节字符集"。

孙鑫的MFC视频,字符串没有初始化、SOCKET没有判断返回值等,楼主切忌!
bazzi2011 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xhxingyi 的回复:]
[/Quote]

晕,我的是vs2005,你改下头文件就行了呗
一鸣惊天 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 dyongfly123 的回复:]

57920702 QQ联系!
[/Quote]

再谢大神
jackson35296 2011-10-31
  • 打赏
  • 举报
回复
因为孙鑫的编程习惯不好,数组总是不清0
char recvBuf[100];应改为char recvBuf[100] = {0};
除此之外上面这些代码,还相当不规范
bind listen accept connect send recv函数都没有判断返回值,没有做错误处理,都假定是成功的。
一鸣惊天 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bazzi2011 的回复:]

把你的项目属性先改为单字节形式,VC6和VC2010最主要的冲突就是安全性和字节属性上!
"项目"->"项目属性"->"配置属性"->"常规"->"字符集",改为"未设置"。

之后

===================================
Server

#include "stdafx.h"
#include <Winsock2.h>
#include <……
[/Quote]


大神:
1>f:\vs2010\mfc\tcpsrv\tcpsrv\tcpsrv.cpp(1): fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory

说明一下,我的都是Win32 Console Application
bazzi2011 2011-10-31
  • 打赏
  • 举报
回复
把你的项目属性先改为单字节形式,VC6和VC2010最主要的冲突就是安全性和字节属性上!
"项目"->"项目属性"->"配置属性"->"常规"->"字符集",改为"未设置"。

之后

===================================
Server


#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}


if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

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)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
memset (sendBuf, 0, sizeof (sendBuf));
sprintf_s(sendBuf,_T("Welcome %s to http://www.ding.org"),
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}

============================================

Client


#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}


if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

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,sizeof(SOCKADDR));

char recvBuf[100];
memset (recvBuf, 0, sizeof (recvBuf));
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient, _T("this is zhangsan"), strlen(_T("this is zhangsan"))+1, 0);

closesocket(sockClient);
WSACleanup();
}
一鸣惊天 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bazzi2011 的回复:]

SERVER

while(1)
{
SOCKET socketConn=accept(socketSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
memset (sendBuf, 0, sizeof (sendBuf));
sprintf(sen……
[/Quote]

烫字没减少,原来welcome 204.204.204.204 to http://www.ding.org变成了空格。

还有为什么是 204.204.204.204 而不是127.0.0.1
bazzi2011 2011-10-31
  • 打赏
  • 举报
回复
SERVER

while(1)
{
SOCKET socketConn=accept(socketSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
memset (sendBuf, 0, sizeof (sendBuf));
sprintf(sendBuf,"Welcome %s to http://www.ding.org",inet_ntoa(addrClient.sin_addr));
send(socketConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(socketConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(socketConn);
}
=========================================
CLIENT

char recvBuf[100];
memset (recvBuf, 0, sizeof (recvBuf));
recv(socketClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(socketClient,"this is zhangsan",strlen("this is zhangsan")+1,0);
=======================

添加红色部分就行了,孙鑫的书中的字符串大多没有初始化,这不是个好习惯!
一鸣惊天 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackson35296 的回复:]

因为孙鑫的编程习惯不好,数组总是不清0
char recvBuf[100];应改为char recvBuf[100] = {0};
除此之外上面这些代码,还相当不规范
bind listen accept connect send recv函数都没有判断返回值,没有做错误处理,都假定是成功的。
[/Quote]

还有,我不懂204.204.204.204 怎么来的,明明我用的是127.0.0.1
一鸣惊天 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackson35296 的回复:]

因为孙鑫的编程习惯不好,数组总是不清0
char recvBuf[100];应改为char recvBuf[100] = {0};
除此之外上面这些代码,还相当不规范
bind listen accept connect send recv函数都没有判断返回值,没有做错误处理,都假定是成功的。
[/Quote]

char recvBuf[100];应改为char recvBuf[100] = {0};

两个工程共两个char recvBuf[100],初始化和不初始化共4种可能,都试过了:

两种 :第二个工程不断输出 烫烫烫(很多“烫”字)welcome 204.204.204.204 to http://www.ding.org 烫烫(很多烫)
这时,第一个工程依旧啥都没有。

两种 : 第二个工程啥也没有,第一个工程有个光标。。
加载更多回复(2)

18,358

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧