我正在尝试用C编写服务器客户端程序,其中客户端将以5个字节的形式发送一堆消息:第一个字节将包含一个命令,接下来的四个将包含一个密钥。它看起来像这样:
rc = write(sockfd, &op, 1);
if (rc != 1)
{
printf("error! write() failed: %s\n", strerror(errno));
break;
}
uint32_t net_num = htonl(num);
int nsent = 0;
while (nsent < 4)
{
rc = write(sockfd, &net_num + nsent, 4 - nsent);
if (rc <= 0)
{
printf("error! write() failed: %s\n", strerror(errno));
break;
}
nsent += rc;
}
if (rc <= 0)
break;
}
在接收端,我有:
while((bytes = recv(socket,buffer,5,0)) > 0)
{
//printf("%d\t%d\t%d\t%d\t%d\n",(int)buffer[0],(int)buffer[1], (int)buffer[2],(int)buffer[3],(int)buffer[4]);
key = ((buffer[4] << 24) | (buffer[3] << 16) | (buffer[2] << 8) | (buffer[1]));
if((int)buffer[0] == 0)
{
do command 0, etc...
我遇到的问题是我无法获得密钥。我已经尝试切换班次的顺序,但我得到的是与客户端发送的密钥不匹配的数字。我很茫然。
更奇怪的是,如果我在没有打印的情况下编译服务器,我会遇到分段故障。如果我取消注释printf,它工作正常。这似乎超级奇怪。
有谁知道可能导致这种情况的原因? 提前谢谢。
答案 0 :(得分:0)
rc = write(sockfd, &net_num + nsent, 4 - nsent);
错误,&net_num
是指向32位对象的指针,因此&net_num+1
将指向下一个32位对象。这超出了目标。您可以在发送之前转换为char指针,或复制到小的char缓冲区,如下所示:
uint32_t net_num = htonl(num);
char buff[sizeof net_num];
memcpy (buff, &net_num, sizeof buff);
int nsent;
for nsent=0; nsent < sizeof buff; nsent += rc;)
{
rc = write(sockfd, buff + nsent, 4 - nsent);
if (rc == -1 && errno == EAGAIN) { rc=0; continue; }
if (rc <= 0)
{
printf("error! write() failed: %s\n", strerror(errno));
break;
}
}