linux read recv,read()/ recv()成功,但缓冲区未更改且为空

在Linux上,作者遇到一个C语言编程的问题,正在编写一个客户端来读取服务器通过TCP套接字发送的数据。尽管服务器在监听并且recv()或read()函数返回了预期的字节数,但缓冲区内容为空,strlen()返回0。代码中展示了客户端的实现,包括套接字创建、连接、发送请求和接收回复的步骤。作者寻求帮助理解发生了什么错误,特别是关于套接字编程的新手问题。
摘要由CSDN通过智能技术生成

我正在编写一个客户端,以使用LINUX上的C脚本读取TCP下通过套接字从服务器发送回的数据。

该服务器永远运行,我验证是否可以得到答复netcat localhost [PORT_NUMBER]。使用以下命令检查时,服务器处于LISTEN状态netstat -nap

recv()函数返回预期的字节数,但是buffer变空并且strlen(buffer)为0。我还尝试更改为read(),这没想到会有不同的结果,并且显示了相同的问题。

这是代码。

#include

#include //strlen

#include

#include //inet_addr

#include

#include

int main(int argc, char *argv[])

{

int socket_desc, msg_rep_size = 1200, msg_size = 100;

struct sockaddr_in server;

char message[msg_size], server_reply[msg_rep_size];

//Create socket

socket_desc = socket(AF_INET, SOCK_STREAM, 0);

if (socket_desc == -1)

{

printf("Could not create socket");

}

server.sin_addr.s_addr = inet_addr("0.0.0.0");

server.sin_family = AF_INET;

server.sin_port = htons(31114); // PORT_NUMBER

//Connect to remote server

if (connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)

{

printf("connect error");

return 1;

}

printf("Connected");

while (1)

{

// send some data

bzero(message, msg_size);

strncpy(message, "REQUEST\n", msg_size);

if (send(socket_desc, message, msg_size, 0) < 0)

{

printf("Send failed");

return 1;

}

printf("Data Send\n");

// Receive a reply from the server

bzero(server_reply, msg_rep_size);

int read_result = recv(socket_desc, server_reply, msg_rep_size, 0);

if (read_result < 0)

{

printf("Receive failed\n");

return 1;

}

else

{

printf("Reply received\n");

printf("read_result: %d\n", read_result);

printf("strlen(server_reply): %d\n", (int)strlen(server_reply));

printf("Reply: %s\n", server_reply);

}

usleep(8);

}

return 0;

}

如果我从

int read_result = recv(socket_desc, server_reply, msg_rep_size, 0);

int read_result = read(socket_desc, server_reply, msg_rep_size);

感谢您的帮助。我是套接字编程的新手,无法跟踪发生了什么。

PS。答复的预期字节大小为1108,这是正确的。我打算将最大大小设为1200,以确认接收到正确的字节数。

PS2。也请随时对低级c的编码风格进行评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值