因为长度是未知的,所以纠结了···
char * buf; //收到的数据包存放的首地址
buf = (char *) malloc (sizeof(char));
/* 接收客户端的消息 */
int length=recv(new_server_socket,buf,strlen(buf),0); //此处不知道写buf还是写*buf?我记得应该写一个数组名的,而不是一个指针···
printf("length=[%d]\n",length);
printf("buf=%s\n",buf);
36 个解决方案
#1
数组名就是指针
试试自己写个函数往数组填,看看需要什么参数
试试自己写个函数往数组填,看看需要什么参数
#2
简单一点,定义大数组,虽然浪费一点
#3
我接收到的字符串的前4位就是字符串的长度,是先接收长度在malloc对吗?
unsigned int len;
memcpy(len,buf,4);
buf = (char *) malloc (len));//对吗
#4
不是很懂。。可以先分配一些空间,放入字符串。写个判断语句,如果空间不够,再分配一些。。这样不浪费。。
估计应该奏效!!!我分数太少,,给点点吧。。
估计应该奏效!!!我分数太少,,给点点吧。。
#5
最好先获得数据长度,然后再分配空间
或者循环收
或者循环收
#6
我接收到的字符串的前4位就是字符串的长度,是先接收长度在malloc对吗?
但是只要接收了前4位,后边的数据紧接着就来了,如何控制只先接收前4位,然后分配空间,然后再接收?
unsigned int len;
memcpy(len,buf,4);
buf = (char *) malloc (len));//对吗
不对的话,麻烦写下,谢谢!
#7
不对,先recv 4位,得到长度
int length = 0;
int ret=recv(new_server_socket,&length,4,0);
buf = new char[length];
int length = 0;
int ret=recv(new_server_socket,&length,4,0);
buf = new char[length];
#8
直接定义个char buf[2048];应该够用了吧
#9
····我是按照长度来接收的,这个长度在后边还有用,所以不能这样定义
#10
C中有柔性数组的概念,可以解决这个问题
http://topic.csdn.net/u/20091209/22/47728558-4745-47f8-af2c-44720d01380b.html
http://topic.csdn.net/u/20091209/22/47728558-4745-47f8-af2c-44720d01380b.html
http://topic.csdn.net/u/20091209/22/47728558-4745-47f8-af2c-44720d01380b.html
http://topic.csdn.net/u/20091209/22/47728558-4745-47f8-af2c-44720d01380b.html
#11
buf = malloc char[length];
这样分配的就是整个数组的长度了吧,然后我再
recv(new_server_socket,buf,strlen(buf),0);
就可以整个都接收了?请问对吗?
#12
对,如果接收的是字符串,得buf = new char[length +1];
#13
new在我这不好使···
epoll_server.c:63: error: ‘new’ undeclared (first use in this function)
epoll_server.c:63: error: (Each undeclared identifier is reported only once
epoll_server.c:63: error: for each function it appears in.)
用malloc一样吧?
#14
buf =malloc (length+1);
······?
#15
··· 暂时还没想这么复杂···时间来不及了,先怎么简单怎么做吧,那个等有空学学~
#16
应该是:
recv(new_server_socket,buf,length,0);
如果buf[0]=='\0'那么strlen(buf)就是0。
另外,最好先初始化buf再接收。
#17
前面也不对,长度的值还是要先计算的,要看发送方是按照什么编码送长度的:
char lenbuf[5];
int length = 0;
int ret=recv(new_server_socket,lenbuf,4,0);
//再根据lenbuf计算length。
#18
支持!
KISS - Keep It Sample and Stupid.
#19
char lenbuf[5];//定义这个是什么意思,能解释下吗?为什么上面的那个不对
//再根据lenbuf计算length。//能具体写下吗,谢谢
#20
还有一点想请教大家:
recv(new_server_socket,buf,length,0);
buf+=4;
memcpy(m,buf,4);//buf所指的字符串的这4位存放的是一个int型的数字,我想将这个数字赋值给m,后边要用,
//但是总是提示:passing argument 1 of ‘memcpy’ makes pointer from integer without a cast,请问怎么改?
#21
根据应用的情况,开和适当长度的缓冲区,然后循环接受所有数据
#22
循环接收?没写过,能写个例子吗?谢谢!
#23
memcpy(m,buf,4);//buf所指的字符串的这4位存放的是一个int型的数字,我想将这个数字赋值给m,后边要用,
//但是总是提示:passing argument 1 of ‘memcpy’ makes pointer from integer without a cast,请问怎么改?
memcpy语法:
void *memcpy( void *dest, const void *src, size_t count );
第一个参数类型是void *, 所以应该改写为:
memcpy((void *)m,buf,4); //做个指针类型的强制转换
#24
Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual
expressions, and the order in which side effects take place, is unspecified. Between the previous
and next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined.
expressions, and the order in which side effects take place, is unspecified. Between the previous
and next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined.
#25
可是我想定义成一个int型···后面还要用到这个m的值,如果这样改了,后面怎么用m的值?
不改的话还有别的方法吗?谢谢!
#26
······
#27
发送的时候,长度是整数,但是send函数的参数是字符指针,所以发送的时候要按照一定的方式把整数放到字符串里,这样,接收的时候就要按照同样的方式从收到的字符串中计算出数字。
直接将长度变量的空间转成字符串来传我没试过,这样做不太好,因为整数在不同的系统里字节数不一定一样。
下面一个2个字节表示长度的例子:
发送方:
lenbuf[1] = len / 256;
lenbuf[2] = len % 256;
send(new_server_socket,lenbuf, 2,0);
接收方:
recv(new_server_socket, lenbuf, 2, 0);
len = lenbuf[0] * 256 + lenbuf[1];
#28
不会影响m的值,照用不误
#29
有误,应该是分别是lenbuf[0]和lenbuf[1]。
#30
不明白···两字节···16位阿··
条件规定的是我发的一个整数数字在这个字符串里是占4位···
#31
哦~
#32
你那个是BSTR数据吧.
在MFC下面用CString来处理:
CString result = bstrText; //左边是获得结果,右边是待接收的BSTR字符串
c++处理:
char* result = ConvertBSTRToString(bstrText);
SysFreeString(result); // 用完释放
如果不是BSTR,无非就是手工计算一下字符串的长度,和起始指针的位置,然后分配内存复制就可以了
在MFC下面用CString来处理:
CString result = bstrText; //左边是获得结果,右边是待接收的BSTR字符串
c++处理:
char* result = ConvertBSTRToString(bstrText);
SysFreeString(result); // 用完释放
如果不是BSTR,无非就是手工计算一下字符串的长度,和起始指针的位置,然后分配内存复制就可以了
#33
谢谢!只是暂时还没写过这种处理方法···很陌生···
C语言处理··
#34
如果data前四个字节存放的是长度num的话,那么应该做
*data++ = ((num) >> 24) & 0xff;
*data++ = ((num) >> 16) & 0xff;
*data++ = ((num) >> 8) & 0xff;
*data = (num) & 0xff;
的转换吧!!
要把长度却出来以后再malloc()
*data++ = ((num) >> 24) & 0xff;
*data++ = ((num) >> 16) & 0xff;
*data++ = ((num) >> 8) & 0xff;
*data = (num) & 0xff;
的转换吧!!
要把长度却出来以后再malloc()
#35
不明白···能解释下吗?
感觉不如我先接收前4个字节导出期内容,也就是整个字符串的长度,然后malloc···
#36
按照17楼的说法我先接收前4位的内容得到长度然后分配空间,然后接收总长度···可是我实验了下,发送端确认已经发出去了,但是这边没收到···
接收端:
char * buf; //收到的数据包存放的首地址
int length1 = 0;
printf("start recv 4\n");
int acv=recv(new_server_socket,&length1,4,0);
printf("acv=%d\n",acv);
buf =malloc (length1+1); // 对数据包分配空间
printf("start recv\n");
/* 接收客户端的消息 */
int length=recv(new_server_socket,buf,length,0);
printf("length=[%d]\n",length);
printf("buf=%s\n",buf);
结果显示:
start recv 4
acv=-1
start recv
length=[-1]
buf=
请问下,是什么原因?
#1
数组名就是指针
试试自己写个函数往数组填,看看需要什么参数
试试自己写个函数往数组填,看看需要什么参数
#2
简单一点,定义大数组,虽然浪费一点
#3
我接收到的字符串的前4位就是字符串的长度,是先接收长度在malloc对吗?
unsigned int len;
memcpy(len,buf,4);
buf = (char *) malloc (len));//对吗
#4
不是很懂。。可以先分配一些空间,放入字符串。写个判断语句,如果空间不够,再分配一些。。这样不浪费。。
估计应该奏效!!!我分数太少,,给点点吧。。
估计应该奏效!!!我分数太少,,给点点吧。。
#5
最好先获得数据长度,然后再分配空间
或者循环收
或者循环收
#6
我接收到的字符串的前4位就是字符串的长度,是先接收长度在malloc对吗?
但是只要接收了前4位,后边的数据紧接着就来了,如何控制只先接收前4位,然后分配空间,然后再接收?
unsigned int len;
memcpy(len,buf,4);
buf = (char *) malloc (len));//对吗
不对的话,麻烦写下,谢谢!
#7
不对,先recv 4位,得到长度
int length = 0;
int ret=recv(new_server_socket,&length,4,0);
buf = new char[length];
int length = 0;
int ret=recv(new_server_socket,&length,4,0);
buf = new char[length];
#8
直接定义个char buf[2048];应该够用了吧
#9
····我是按照长度来接收的,这个长度在后边还有用,所以不能这样定义
#10
C中有柔性数组的概念,可以解决这个问题
http://topic.csdn.net/u/20091209/22/47728558-4745-47f8-af2c-44720d01380b.html
http://topic.csdn.net/u/20091209/22/47728558-4745-47f8-af2c-44720d01380b.html
http://topic.csdn.net/u/20091209/22/47728558-4745-47f8-af2c-44720d01380b.html
http://topic.csdn.net/u/20091209/22/47728558-4745-47f8-af2c-44720d01380b.html
#11
buf = malloc char[length];
这样分配的就是整个数组的长度了吧,然后我再
recv(new_server_socket,buf,strlen(buf),0);
就可以整个都接收了?请问对吗?
#12
对,如果接收的是字符串,得buf = new char[length +1];
#13
new在我这不好使···
epoll_server.c:63: error: ‘new’ undeclared (first use in this function)
epoll_server.c:63: error: (Each undeclared identifier is reported only once
epoll_server.c:63: error: for each function it appears in.)
用malloc一样吧?
#14
buf =malloc (length+1);
······?
#15
··· 暂时还没想这么复杂···时间来不及了,先怎么简单怎么做吧,那个等有空学学~
#16
应该是:
recv(new_server_socket,buf,length,0);
如果buf[0]=='\0'那么strlen(buf)就是0。
另外,最好先初始化buf再接收。
#17
前面也不对,长度的值还是要先计算的,要看发送方是按照什么编码送长度的:
char lenbuf[5];
int length = 0;
int ret=recv(new_server_socket,lenbuf,4,0);
//再根据lenbuf计算length。
#18
支持!
KISS - Keep It Sample and Stupid.
#19
char lenbuf[5];//定义这个是什么意思,能解释下吗?为什么上面的那个不对
//再根据lenbuf计算length。//能具体写下吗,谢谢
#20
还有一点想请教大家:
recv(new_server_socket,buf,length,0);
buf+=4;
memcpy(m,buf,4);//buf所指的字符串的这4位存放的是一个int型的数字,我想将这个数字赋值给m,后边要用,
//但是总是提示:passing argument 1 of ‘memcpy’ makes pointer from integer without a cast,请问怎么改?
#21
根据应用的情况,开和适当长度的缓冲区,然后循环接受所有数据
#22
循环接收?没写过,能写个例子吗?谢谢!
#23
memcpy(m,buf,4);//buf所指的字符串的这4位存放的是一个int型的数字,我想将这个数字赋值给m,后边要用,
//但是总是提示:passing argument 1 of ‘memcpy’ makes pointer from integer without a cast,请问怎么改?
memcpy语法:
void *memcpy( void *dest, const void *src, size_t count );
第一个参数类型是void *, 所以应该改写为:
memcpy((void *)m,buf,4); //做个指针类型的强制转换
#24
Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual
expressions, and the order in which side effects take place, is unspecified. Between the previous
and next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined.
expressions, and the order in which side effects take place, is unspecified. Between the previous
and next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined.
#25
可是我想定义成一个int型···后面还要用到这个m的值,如果这样改了,后面怎么用m的值?
不改的话还有别的方法吗?谢谢!
#26
······
#27
发送的时候,长度是整数,但是send函数的参数是字符指针,所以发送的时候要按照一定的方式把整数放到字符串里,这样,接收的时候就要按照同样的方式从收到的字符串中计算出数字。
直接将长度变量的空间转成字符串来传我没试过,这样做不太好,因为整数在不同的系统里字节数不一定一样。
下面一个2个字节表示长度的例子:
发送方:
lenbuf[1] = len / 256;
lenbuf[2] = len % 256;
send(new_server_socket,lenbuf, 2,0);
接收方:
recv(new_server_socket, lenbuf, 2, 0);
len = lenbuf[0] * 256 + lenbuf[1];
#28
不会影响m的值,照用不误
#29
有误,应该是分别是lenbuf[0]和lenbuf[1]。
#30
不明白···两字节···16位阿··
条件规定的是我发的一个整数数字在这个字符串里是占4位···
#31
哦~
#32
你那个是BSTR数据吧.
在MFC下面用CString来处理:
CString result = bstrText; //左边是获得结果,右边是待接收的BSTR字符串
c++处理:
char* result = ConvertBSTRToString(bstrText);
SysFreeString(result); // 用完释放
如果不是BSTR,无非就是手工计算一下字符串的长度,和起始指针的位置,然后分配内存复制就可以了
在MFC下面用CString来处理:
CString result = bstrText; //左边是获得结果,右边是待接收的BSTR字符串
c++处理:
char* result = ConvertBSTRToString(bstrText);
SysFreeString(result); // 用完释放
如果不是BSTR,无非就是手工计算一下字符串的长度,和起始指针的位置,然后分配内存复制就可以了
#33
谢谢!只是暂时还没写过这种处理方法···很陌生···
C语言处理··
#34
如果data前四个字节存放的是长度num的话,那么应该做
*data++ = ((num) >> 24) & 0xff;
*data++ = ((num) >> 16) & 0xff;
*data++ = ((num) >> 8) & 0xff;
*data = (num) & 0xff;
的转换吧!!
要把长度却出来以后再malloc()
*data++ = ((num) >> 24) & 0xff;
*data++ = ((num) >> 16) & 0xff;
*data++ = ((num) >> 8) & 0xff;
*data = (num) & 0xff;
的转换吧!!
要把长度却出来以后再malloc()
#35
不明白···能解释下吗?
感觉不如我先接收前4个字节导出期内容,也就是整个字符串的长度,然后malloc···
#36
按照17楼的说法我先接收前4位的内容得到长度然后分配空间,然后接收总长度···可是我实验了下,发送端确认已经发出去了,但是这边没收到···
接收端:
char * buf; //收到的数据包存放的首地址
int length1 = 0;
printf("start recv 4\n");
int acv=recv(new_server_socket,&length1,4,0);
printf("acv=%d\n",acv);
buf =malloc (length1+1); // 对数据包分配空间
printf("start recv\n");
/* 接收客户端的消息 */
int length=recv(new_server_socket,buf,length,0);
printf("length=[%d]\n",length);
printf("buf=%s\n",buf);
结果显示:
start recv 4
acv=-1
start recv
length=[-1]
buf=
请问下,是什么原因?