【发布时间】:2021-12-15 13:11:20
【问题描述】:
我有下一个代码:
while(1) {
int length=sizeof(client);
connSock=accept(readSock, (struct sockaddr*) &client,&length);
if(!fork())
{
close(readSock);
char receiveBuff[1000],sendBuff[1000];
int status;
int size_buf;
do {
status=recv(connSock, receiveBuff, 1000,0);
printf("%d status \n",status);
printf("%s recv buff\n", receiveBuff);
memcpy(sendBuff,receiveBuff,sizeof(receiveBuff));
send(connSock, &sendBuff, sizeof(sendBuff), 0);
}while (status!=0);
close(connSock);
exit(0);
}
close(connSock);
}
我正在尝试发送消息"Test" 并且recv() 函数返回4(正确的长度),但是当我尝试打印receiveBuffer 时它不起作用。这是输出:
4 status
h: recv buff
这是来自客户端的代码:
void Client_Connector::Start_Connection()
{
this->sock=socket(AF_INET,SOCK_STREAM,0);
bzero(&this->server,sizeof(server));
this->server.sin_family=AF_INET;
inet_pton(AF_INET,"127.0.0.1", &this->server.sin_addr);
server.sin_port=htons(2500);
int status=connect(sock,(struct sockaddr*) &server, sizeof(server));
if (status==0)
cout<<"Sunteti conectat! \n";
else
Eroare("Eroare de conexiune! Conexiunea nu s-a putut realiza.");
}
void Client_Connector::send_Buffer(char* sendMessage)
{
int i;
i=send(sock, &sendMessage,strlen(sendMessage)+1,0);
cout<<i<<endl;
}
然后调用函数:
connecter.Start_Connection();
string sendmsg("Test");
sendmsg+="\0";
connecter.send_Buffer((char*)sendmsg.c_str());
【问题讨论】:
-
您期望的输出是什么?你实际上在发送什么?另请记住,TCP 是一种流式传输协议,您可能需要多次调用
recv才能接收所有数据。 -
另外几点说明,您确定您收到的数据会像字符串一样以空值结尾吗?而
send调用中的&sendBuff是错误的,它应该是普通的sendBuff或&sendBuff[0]。 -
“我正在尝试发送消息“测试”” - 请说明此消息的实际发送方式,而不仅仅是您尝试接收的方式。
receiveBuff也未初始化为 0,因此将包含随机数据。具体来说,它可能包含\r,这会导致覆盖已写入同一行的内容,从而与可见输出混淆。 -
另外几个注意事项,如果您有要传输的以空字符结尾的字符串,请不要发送例如
sizeof(sendBuff)字节数。这将发送整个缓冲区,包括您尚未初始化的部分。而是使用strlen(sendBuff) + 1仅发送字符串本身包括空终止符。 -
客户端代码是 C++,在 C++ 中,当你觉得需要使用 C 风格的强制转换时(就像你在
(char*)sendmsg.c_str()中所做的那样),你应该把它当作你正在做的标志有事吗。而是将对实际字符串对象sendmsg的常量引用传递给函数,并在对send的调用中使用c_str()和length() + 1。