急!!!在线等,一个运行错误:运行时,报红 X 提示为“......”内存引用“......”内存,该内存不能为“written”

scsnsjsl_cs_dn 2008-09-24 09:31:48
以下是一个基于TCP的网络应用程序,该程序是在WIN32 控制台上编写。服务器和客户端放在同一个工作区的2个工程里
代码如下:
服务器程序:
#include <Winsock2.h>
#include <stdio.h>
#include <string>

int main()
{
WSADATA data;
WORD version;

if(WSAStartup(MAKEWORD(1,1),&data)!=0)
{
printf("WSAStartup Error:%d",WSAGetLastError());
WSACleanup();
exit(-1);
}

SOCKET ServiceListen;
ServiceListen=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==ServiceListen)
{
printf("socket Error:%d",WSAGetLastError());
WSACleanup();
exit(-1);
}

SOCKADDR_IN ServiceAddr;
ServiceAddr.sin_family=AF_INET;
ServiceAddr.sin_port=htons(6000);
ServiceAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

if(SOCKET_ERROR==bind(ServiceListen,(struct sockaddr FAR *)&ServiceAddr,sizeof(ServiceAddr)))
{
printf("bind Error:%d",WSAGetLastError());
WSACleanup();
exit(-1);
}

listen(ServiceListen,5);

SOCKADDR_IN FromAddr;
int iLen=sizeof(FromAddr);
char szInfo[100];

SOCKET ServiceSendRecv;
while(2)
{

ServiceSendRecv=accept(ServiceListen,(struct sockaddr FAR *)&FromAddr,&iLen);
if(ServiceSendRecv==INVALID_SOCKET)
{
printf("accept Error:%d",WSAGetLastError());
WSACleanup();
exit(-1);
}

sprintf(szInfo,"%s:%d","来自服务器的消息",FromAddr.sin_addr);
send(ServiceSendRecv,szInfo,strlen(szInfo)+1,0);

// memset(szInfo,'0',100);
int iCount;
char szInformation[100];
iCount=recv(ServiceSendRecv,szInformation,100,0);
if(iCount>1)
{
szInfo[iCount]='\0';
sprintf("客户端发送过来的消息:%s",szInformation);
}
closesocket(ServiceSendRecv);
}


return 1;
}


客户端程序:
#include <Winsock2.h>
#include <stdio.h>
#include <string>

int main()
{
WSADATA data;
WORD version;

if(WSAStartup(MAKEWORD(1,1),&data)!=0)
{
printf("WSAStartup Error:%d",WSAGetLastError());
WSACleanup();
exit(-1);
}

SOCKET ClientSocket;
ClientSocket=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==ClientSocket)
{
printf("socket Error:%d",WSAGetLastError());
WSACleanup();
exit(-1);
}

SOCKADDR_IN ClientAddr;
ClientAddr.sin_family=AF_INET;
ClientAddr.sin_port=htons(6000);
ClientAddr.sin_addr.S_un.S_addr=inet_addr("169.254.165.10");

if(SOCKET_ERROR==connect(ClientSocket,(struct sockaddr FAR *)&ClientAddr,sizeof(ClientAddr)))
{
printf("connect Error:%d",WSAGetLastError());
WSACleanup();
exit(-1);
}

char szInfoClient[100];
int iCount=recv(ClientSocket,szInfoClient,100,0);
if(iCount>1)
{
szInfoClient[iCount]='\0';
printf("服务器发送的消息:%s\n",szInfoClient);
}

PHOSTENT phe;
phe=gethostbyname("PC-200807201643");

SOCKADDR_IN TempAddr;
memcpy(&TempAddr.sin_addr,phe->h_addr_list,phe->h_length);
sprintf(szInfoClient,"来自客户端:%s 的消息",inet_ntoa(TempAddr.sin_addr));
send(ClientSocket,szInfoClient,strlen(szInfoClient)+1,0);

return -1;
}

运行时,报红 X 提示为“......”内存引用“......”内存,该内存不能为“written”

现在大致确定错误出现在 服务器 的发消息部分,如下:
int iCount;
char szInformation[100];
iCount=recv(ServiceSendRecv,szInformation,100,0);
if(iCount>1)
{
szInfo[iCount]='\0';
sprintf("客户端发送过来的消息:%s",szInformation);
}
closesocket(ServiceSendRecv);
的iCount=recv(ServiceSendRecv,szInformation,100,0);语句,但找不出错在那里。请各位指教!!!
...全文
169 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
WinEggDrop 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 scsnsjsl_cs_dn 的回复:]
引用 9 楼 cwc270 的回复:
sprintf("客户端发送过来的消息:%s",szInformation); 用错了吧


对,应该是printf 用成了sprintf
[/Quote]

"sprintf("客户端发送过来的消息:%s",szInformation); 用错了吧 "

呵呵,这样编译时不报错?这根本不可能.
kevin0808 2008-09-26
  • 打赏
  • 举报
回复
同意2楼,呵呵
数组越界了
scsnsjsl_cs_dn 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 WinEggDrop 的回复:]
引用 13 楼 scsnsjsl_cs_dn 的回复:
引用 9 楼 cwc270 的回复:
sprintf("客户端发送过来的消息:%s",szInformation); 用错了吧


对,应该是printf 用成了sprintf


"sprintf("客户端发送过来的消息:%s",szInformation); 用错了吧 "

呵呵,这样编译时不报错?这根本不可能.
[/Quote]

看来你对可变参数的函数理解还是不太清楚
sprintf就是一个可变参数函数,并且在我的代码中有这句话,可以运行。只是运行到该句时,报错而已!!!
scsnsjsl_cs_dn 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cwc270 的回复:]
sprintf("客户端发送过来的消息:%s",szInformation); 用错了吧
[/Quote]

对,应该是printf 用成了sprintf
cwc270 2008-09-25
  • 打赏
  • 举报
回复
sprintf("客户端发送过来的消息:%s",szInformation); 用错了吧
oo_v_oo 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 binsir543 的回复:]
“......”内存引用“......”内存,该内存不能为“written”
[/Quote]

大家注意了吗,数组越界不会有这样的效果
建议LZ使用Debug,出问题是将栈、相关变量的值记录下来,补到帖子里,再 看看
deh_1984 2008-09-25
  • 打赏
  • 举报
回复
这样的错误看起来像是你引用了不存在的指针,某个指针为空,但是你引用了它,没有看代码,猜测,
Leo_red 2008-09-25
  • 打赏
  • 举报
回复
这种问题一般是越界引起
cnzdgs 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 scsnsjsl_cs_dn 的回复:]
引用 3 楼 cnzdgs 的回复:
没看出错误,只看出下面两行是多余的:
szInfo[iCount]='\0';
szInfoClient[iCount]='\0';

错误信息具体是什么?(错误代码的地址和引用的内存地址)

不明白
[/Quote]
我的意思是,你把错误信息完整贴出来,不要省略。
WinEggDrop 2008-09-25
  • 打赏
  • 举报
回复
char szInformation[100];
iCount=recv(ServiceSendRecv,szInformation,100,0);
if(iCount>1)
{
szInfo[iCount]='\0';
sprintf("客户端发送过来的消息:%s",szInformation);
}


如果recv时接够了100个字节,那么szInfo[iCount]='\0';就是相当于szInfo[100]='\0';但szInformation数组最高上限只能到99.
Zark 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoujianhei 的回复:]
char szInformation[100+1];
[/Quote]

多半是这个回复正确,szInfo[iCount]='\0'; 这一句越界了. 由于信息不全,全凭猜测.
binsir543 2008-09-24
  • 打赏
  • 举报
回复
“......”内存引用“......”内存,该内存不能为“written”
这种错误一般是指针指向了已经被注销了的临时变量地址
scsnsjsl_cs_dn 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnzdgs 的回复:]
没看出错误,只看出下面两行是多余的:
szInfo[iCount]='\0';
szInfoClient[iCount]='\0';
[/Quote]
错误信息具体是什么?(错误代码的地址和引用的内存地址)

不明白
cnzdgs 2008-09-24
  • 打赏
  • 举报
回复
没看出错误,只看出下面两行是多余的:
szInfo[iCount]='\0';
szInfoClient[iCount]='\0';
错误信息具体是什么?(错误代码的地址和引用的内存地址)
lizhigang34 2008-09-24
  • 打赏
  • 举报
回复
一个问题,楼主怎么发两个帖子啊?
zhoujianhei 2008-09-24
  • 打赏
  • 举报
回复
char szInformation[100+1];

18,357

社区成员

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

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