gpt4 book ai didi

c - 套接字如何在 C 中工作?

转载 作者:太空狗 更新时间:2023-10-29 16:26:48 26 4
gpt4 key购买 nike

我对 C 中的套接字编程有点困惑。

您创建一个套接字,将其绑定(bind)到一个接口(interface)和一个 IP 地址,然后让它进行监听。我在上面找到了一些网络资源,并且理解得很好。特别是,我找到了一篇文章 Network programming under Unix systems 非常有用。

让我困惑的是数据到达套接字的时间。

你怎么知道数据包什么时候到达,数据包有多大,你必须自己做所有繁重的工作吗?

我这里的基本假设是数据包可以是可变长度的,所以一旦二进制数据开始出现在套接字中,您如何开始从中构建数据包?

最佳答案

简短的回答是您必须自己完成所有繁重的工作。您会收到通知,有数据可供读取,但您不知道有多少字节可用。在大多数使用可变长度数据包的 IP 协议(protocol)中,数据包前面会有一个已知固定长度的 header 。此 header 将包含数据包的长度。您读取 header ,获取数据包的长度,然后读取数据包。您重复此模式(读取 header ,然后读取数据包)直到通信完成。

从套接字读取数据时,您请求一定数量的字节。 read 调用可能会阻塞,直到读取了请求的字节数,但它返回的字节数可能少于请求的字节数。发生这种情况时,您只需重试读取,请求剩余的字节。

这是一个典型的 C 函数,用于从套接字读取一定数量的字节:

/* buffer points to memory block that is bigger than the number of bytes to be read */
/* socket is open socket that is connected to a sender */
/* bytesToRead is the number of bytes expected from the sender */
/* bytesRead is a pointer to a integer variable that will hold the number of bytes */
/* actually received from the sender. */
/* The function returns either the number of bytes read, */
/* 0 if the socket was closed by the sender, and */
/* -1 if an error occurred while reading from the socket */
int readBytes(int socket, char *buffer, int bytesToRead, int *bytesRead)
{
*bytesRead = 0;
while(*bytesRead < bytesToRead)
{
int ret = read(socket, buffer + *bytesRead, bytesToRead - *bytesRead);
if(ret <= 0)
{
/* either connection was closed or an error occurred */
return ret;
}
else
{
*bytesRead += ret;
}
}
return *bytesRead;
}

关于c - 套接字如何在 C 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com