strcpy_s()运行时总提示tcscat_s.inl,Buffer is too small

jacxie2009 2010-09-04 11:15:15
大体做的就是client从文件取出数据发给server,server对收到的数据排序后发还给client
这是我server端的代码,每次执行到RecvData()中的strcat_s(filebuf,filesize,temp);就出错
提示tcscat_s.inl,Buffer is too small,请大家帮忙看一下,感激不尽

#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#pragma comment(lib,"ws2_32")

#define _CRT_SECURE_NO_DEPRECATE
#define SRVIP_LENGTH 20
#define PORT_NUM 8090
#define TRANS_LENGTH 1024

struct FileInfoPack
{
bool flag;
DWORD filesize;
};
int cmp( const void *a , const void *b )
{
return *(char *)a - *(char *)b;
}
int SendData(SOCKET sock,char* filedata)
{
long sendbyte=0;
if(filedata!=NULL)
{
sendbyte=send(sock,filedata,strlen(filedata),0);
}
else
{
printf("No data sorted!");
return 0;
}
if(sendbyte!=SOCKET_ERROR)
{
return 1;
}
else
{
printf("Cannot send data!");
return 0;
}
}
int RecvData(SOCKET sock,char *data,DWORD filesize)
{
//recive the pack with fileinfo
char temp[TRANS_LENGTH]={0};
DWORD recvbyte=0,tempbyte=0;
char *filebuf=NULL;
filebuf=(char*)malloc(filesize+1);
if(NULL==filebuf)
{
printf("Cannot Allocation Space!");
return 0;//分配空间失败
}
memset(filebuf,0,filesize);//
while(recvbyte<filesize)
{
tempbyte=recv(sock,temp,strlen(temp),0);
if(tempbyte==strlen(temp))
{
recvbyte+=tempbyte;
strcat_s(filebuf,filesize,temp);
}
else if(tempbyte==0)
{
printf("Client quit!");
break;
}
else if(tempbyte==SOCKET_ERROR)
{
printf("Error in recv(),ERROR:d%\n",WSAGetLastError());
break;
}
}
if(recvbyte==filesize)
{
strcpy_s(data,filesize,filebuf);
free(filebuf);
filebuf=NULL;
return 1;
}
else
return 0;
}

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
SOCKADDR_IN socket_addr; //used in accept(,struct sockaddr FAR * addr,)
SOCKET srv_sock=-1,conn_sock; //a descriptor referencing the new socket returned
int WSA_state = 0; //keep the value returned by WSAStartup()
int conn_flag=0,error_num=0;
int len=sizeof(SOCKADDR);
wVersionRequested = MAKEWORD( 1, 1 );
WSA_state = WSAStartup(wVersionRequested, &wsaData );
if (WSA_state != 0 ){
error_num=WSAGetLastError();
printf("Unable to start winsock serve,ERROR:%d\n",error_num);
return;
}
//create a socket used to communicate
srv_sock = socket(AF_INET, SOCK_STREAM, 0);
//set parameters of srv_sock
socket_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
socket_addr.sin_family = AF_INET;
socket_addr.sin_port = htons(PORT_NUM);
conn_flag=bind(srv_sock, (sockaddr*)&socket_addr, sizeof(SOCKADDR));
if( SOCKET_ERROR == conn_flag){
error_num=WSAGetLastError();
printf("bind error!ERROR:%d\n",error_num);
closesocket(srv_sock);
WSACleanup();
return;
}
conn_flag=listen(srv_sock, 5);
if( SOCKET_ERROR == conn_flag ){
error_num=WSAGetLastError();
printf("listen error!ERROR:%d\n",error_num);
closesocket(srv_sock);
WSACleanup();
return;
}
conn_sock = accept(srv_sock, (struct sockaddr*)&socket_addr, &len);//listen the application of connecting,create and return a new Socket
if(INVALID_SOCKET == conn_sock) {
error_num=WSAGetLastError();
printf("listen error!ERROR:%d\n",error_num);
closesocket(srv_sock);
WSACleanup();
return;
}
printf("Serving!\n");
FileInfoPack pack;
int recvbyte=0,flag;
recvbyte=recv(conn_sock,(char*)&pack,sizeof(pack),0);
char* data=NULL;
data=(char*)malloc((pack.filesize+1)*(sizeof(char)));
flag=RecvData(conn_sock,data,pack.filesize);
if(flag!=0)
{
qsort(data,strlen(data),sizeof(data[0]),cmp);
}
else
{
printf("Fail recive data!");
closesocket(srv_sock);
closesocket(conn_sock);
WSACleanup();
return;
}
flag=SendData(conn_sock,data);
//get the result sorted by server
closesocket(srv_sock);
closesocket(conn_sock);
WSACleanup();
}
...全文
435 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jacxie2009 的回复:]
我有free()的
不过main()里的没有
但是有个问题就是,如果我client发的数据比较大时,server端想将这些分块发来的数据保存时用
strcat_s(filebuf,(filesize+1),temp)
怎么我debug时跟了一下,发现temp没有给保存到filebuf里面
[/Quote]
你循环接收就可以了,类似这样的
int nRet = 0;
int nCount = 0;
int nLeft = ...;// 为总共将要接收的字节数
while(...)
{
nRet = recv(SOCKET, filebuf+nCount, MAX_COUNT, 0);
if(SOCKET_ERROR != nRet)
{
nLeft -= nRet;
nCount += nRet;
}
else
{
// Error
}
}
xxd_qd 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jacxie2009 的回复:]
我有free()的
不过main()里的没有
但是有个问题就是,如果我client发的数据比较大时,server端想将这些分块发来的数据保存时用
strcat_s(filebuf,(filesize+1),temp)
怎么我debug时跟了一下,发现temp没有给保存到filebuf里面
[/Quote]
你确定分块发来的东西里,每块的最后都有字符串截止符?
xxd_qd 2010-09-05
  • 打赏
  • 举报
回复
strcat_s(filebuf,filesize+1,temp);
jacxie2009 2010-09-05
  • 打赏
  • 举报
回复
我有free()的
不过main()里的没有
但是有个问题就是,如果我client发的数据比较大时,server端想将这些分块发来的数据保存时用
strcat_s(filebuf,(filesize+1),temp)
怎么我debug时跟了一下,发现temp没有给保存到filebuf里面
昨夜无风 2010-09-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flydreamgg 的回复:]
你malloc了那么多,从来没见你free

还有你调用RecvData之前已经malloc了空间,又在RecvData函数里面malloc一次,真是浪费
[/Quote]

上面看错了,不好意思!!
昨夜无风 2010-09-05
  • 打赏
  • 举报
回复
你malloc了那么多,从来没见你free

还有你调用RecvData之前已经malloc了空间,又在RecvData函数里面malloc一次,真是浪费
jacxie2009 2010-09-05
  • 打赏
  • 举报
回复
试了,楼上正解
谢谢
顺便问一下,如果读入的文件中有换行符,空格,fread()是怎么处理的
我找了一个有字符、数字,换行、空格的文件处理后输出到文件保存后
发现,输出结果前空了好几行

哪位帮忙解释一下,该如何处理

18,357

社区成员

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

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