c - 内存中的套接字文件描述符是什么形式?

标签 c sockets memory

int main()
{
int a;
struct sockaddr_in data;
data.sin_addr.s_addr = INADDR_ANY;
data.sin_family = AF_INET;
data.sin_port = htons(1111); //assuming run on little-endian a.k.a x86
a = socket(AF_INET,SOCK_STREAM,0);
bind(a,(struct sockaddr*)&data, sizeof(data));

close(a);
return 0;
}

现在关注变量int a,我很好奇,一个integer怎么会是文件套接字描述符 作为门 接收发送数据,int a在内存中是如何工作的?

我认为内核在启动套接字时将 integer a 的形式更改为 pointer to integer a ,但这只是一个想法,到底发生了什么?

有人吗?

最佳答案

a 是句柄,参见例如http://en.wikipedia.org/wiki/Handle_%28computing%29

内核将它需要的结构保存在一个表中,这样每次你引用句柄时,它都可以查找它需要的数据。

你可以实现一个简单的句柄机制,例如一个数组:

struct MyData {
  float f;
};

MyData TheArray[100];

void setFloat(int Handle, float v) {
  TheArray[Handle].f = v;
}

float getFloat(int Handle) {
  return TheArray[Handle].f;
}

您函数的用户只知道 setFloat 和 getFloat 存在。使用这个,他不知道你如何在内部跟踪 float ,但仍然可以使用句柄可靠地访问它们。

关于c - 内存中的套接字文件描述符是什么形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068019/

相关文章:

c - 动态内存/realloc 字符串数组

python - Pandas cumsum 使用大量内存

c - 在不使用 union 的情况下,如何在 C 中将 64 个字节的数组视为 16 个整数的数组(反之亦然)?

c - LeetCode : Two Sums (Error: Returning the Array)

c - 为什么打印链表内容时会出现段错误?

从单个客户端套接字 C 连接到多个服务器

delphi - delphi TFileStream“内存不足”

c - SHA_DIGEST_LENGTH 未定义

python - 如何在C(服务器)中收到来自python(客户端)的 "unpack"数据包?

python - 如何重现 "Connection reset by peer"