我在winapi中使用套接字是全新的,但是我有这个代码,我正在尝试打印来自套接字的所有数据,但是当我尝试打印它时,它出现了混乱的符号,我是什么?做错了。我已经查看了有关如何执行此操作的示例,但没有一个示例显示如何在从缓冲区收集数据后打印数据。
do
{
#define DEFAULT_BUFLEN 512
int recvbuflen = DEFAULT_BUFLEN;
char recvbuf[DEFAULT_BUFLEN];
recv(ConnectSocket, recvbuf, recvbuflen, 0);
printf("%.*s", recvbuflen, recvbuf);
}
while (iResult > 0);
好的家伙我已将我的代码更改为
do
{
#define DEFAULT_BUFLEN 1000000
int recvbuflen = DEFAULT_BUFLEN;
char recvbuf[DEFAULT_BUFLEN];
ssize_t len = recv(ConnectSocket, recvbuf, recvbuflen, 0);
recv(ConnectSocket, recvbuf, recvbuflen, 0);
printf("%.*s", recvbuflen, recvbuf);
}
while (iResult > 0);
但是现在它似乎没有打印来自套接字的所有信息,只是第一部分
答案 0 :(得分:2)
正如Valeri和其他人所说,不会忽略recv
的返回值。但是,默认情况下,所有套接字都是阻塞的,我没有提到您使用的是非阻塞套接字。因此,除非断开连接recv
,否则将等到缓冲区已满,然后再返回。我不认为这会导致你的问题。
如果您通过网络发送随机数据,您获得的结果正是人们所期望的。任何高于127的字符值Extended ASCII都可能看起来像是一个奇怪的符号。低于32的字符值(也称为control characters)可能会导致发出蜂鸣声或字符擦除。
答案 1 :(得分:1)
你忽略了所收到的篇幅:
ssize_t len = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if (len > 0)
{
printf("%.*s", (int)len, recvbuffer);
}
else
{
break; // error or EOF
}