关于TCP/IP 的一个简单程序问题???

超gogo 2009-08-26 06:42:32
一样的代码我在VS2008下和VC6.0下分别实验,前者不可用,后者可以用。
服务器端CPP

#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

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

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
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 sockCoon = accept(sockSrv,(SOCKADDR*)&addrClient,&len);

char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://wangtengchao.com",inet_ntoa(addrClient.sin_addr));

send(sockCoon,sendBuf,strlen(sendBuf)+1,0);
//接收信息
char recvBuf[100];
recv(sockCoon,recvBuf,100,0);
printf("%s\n",recvBuf);

//关闭套接字
closesocket(sockCoon);
}

}

客户端CPP

#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

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

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
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];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);

send(sockClient,"i anmclient",strlen("i an client")+1,0);

closesocket(sockClient);
WSACleanup();
}

我在两个IDE中用的是相同的代码,一个解决方案中两个工程,只是由于需要添加Ws2_32.lib,我在VS2008中是通过加入语句
#pragma comment (lib,"Ws2_32.lib")
而在VC6.0中我在项目setting中添加
其余代码一样。在VS2008中有问题,VC6.0正确

问题
在VS2008中先执行服务器,再执行客户端,会出现客户端的DOS窗口不停的刷屏,并且显示的不是
Welcome IP地址 to http://wangtengchao.com"
而是
烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫Welcome IP地址 to http://wangtengchao.com"
烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫
并且一直在客户端不停输出,服务器端没有显示I AM CLIENT

但是!!! 用调试执行时可以正常执行的,也不会出现“烫”

请各位帮忙解决一下啊 谢谢
...全文
94 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
超gogo 2009-08-26
  • 打赏
  • 举报
回复
找到答案,我两次都运行debug中的服务器端的程序 就会出现刷屏的现象。
已经解决问题。谢谢各位的回答
超gogo 2009-08-26
  • 打赏
  • 举报
回复
一闪而过解决了,通过这个结合图的区别可以看出应该是我运行时的问题
是不是同一个解决方案多个工程不应该用CTRL+F5来运行呢??
超gogo 2009-08-26
  • 打赏
  • 举报
回复
我现在右击项目 选择调试-》启动新实例-》通过这样运行时可以正确的实行的。
但是客户端的程序会一闪而过
feilinhe 2009-08-26
  • 打赏
  • 举报
回复
字符串都先赋值0
memset(sendBuf,0,100);
然后就是LS说的结尾补上'\0'
超gogo 2009-08-26
  • 打赏
  • 举报
回复
改了 仍然不行 突然发现了一个问题

在大家注意看两幅图的顶端,有错误的那张执行时不是执行的WSA 和WSAClient 只是显示CMD.EXE

这是为什么呢
雪影 2009-08-26
  • 打赏
  • 举报
回复
char recvBuf[100];
int ret = recv(sockClient,recvBuf,100,0);
recvBuf[len] = '\0'; //这里要加上字符串结束符
printf("%s\n",recvBuf);
雪影 2009-08-26
  • 打赏
  • 举报
回复 1
应该是你代码的问题。
字符串结束时要补‘\0’

#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

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

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
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 sockCoon = accept(sockSrv,(SOCKADDR*)&addrClient,&len);

char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://wangtengchao.com",inet_ntoa(addrClient.sin_addr));

send(sockCoon,sendBuf,strlen(sendBuf)+1,0);
//接收信息
char recvBuf[100];
int len = recv(sockCoon,recvBuf,100,0);
recvBuf[len] = '\0'; //这里要加上字符串结束符
printf("%s\n",recvBuf);

//关闭套接字
closesocket(sockCoon);
}

}

客户端CPP

#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

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

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
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];
int ret = recv(sockClient,recvBuf,100,0);
recvBuf[len] = '\0'; //这里要加上字符串结束符
printf("%s\n",recvBuf);

send(sockClient,"i anmclient",strlen("i an client")+1,0);

closesocket(sockClient);
WSACleanup();
}
超gogo 2009-08-26
  • 打赏
  • 举报
回复
是设置成启动项吧
超gogo 2009-08-26
  • 打赏
  • 举报
回复
请问在哪里设置啊??谢谢,能帮忙看看我的问题吗
晒月光的青蛙 2009-08-26
  • 打赏
  • 举报
回复
一个Solution中多个Project,分别设置project为active project编译就可以了
超gogo 2009-08-26
  • 打赏
  • 举报
回复
还有用debug和release中的生成的文件运行服务器端都可以出现 i am client 但是客户端的DOS窗口会一闪而过
附上两种情况的图

超gogo 2009-08-26
  • 打赏
  • 举报
回复
还有一个问题是 在同个解决方案中又多个工程,运行的方法是什么???
是不是分别选中工程 然后按CTRL+F5就行了??

18,356

社区成员

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

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