套接字印刷很奇怪

时间:2013-04-21 13:34:39

标签: c++ sockets

我在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);

但是现在它似乎没有打印来自套接字的所有信息,只是第一部分

2 个答案:

答案 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
}