初学网络编程,自己写服务端和客户端简单的socket通信时,遇到了一个问题比较迷惑:
在服务端编程时,会创建两个文件描述符sfd和cfd,其中sfd用来绑定服务端的地址信息,后面调用accept的时候,使用的实参是sfd,返回给了cfd,最终用read和write函数的时候,都是通过cfd来进行读写的,(个人感觉这里的cfd是否就可以理解是保存了客户端的地址信息,相当于客户端的套接字?)也就是说这里读写时使用的是对方的套接字进行读写的?
然后到了客户端编程时,只创建了一个文件描述符fd,然后后面使用connect函数时,实参使用的也是这个fd,而后面使用read和write时,也是通过fd来进行读写的。但是我从一些资料上看到,客户端如果没有给套接字使用bind,操作系统会自动分配地址信息绑定到这个套接字上,那就说明客户端中的fd依然是客户端自身的套接字?
这样我就觉得很奇怪了:为什么在服务端read和write是用的对方的套接字,而客户端read和write时是用的自己的套接字呢?既然都用的是相同的函数,那这样不就矛盾了吗?
请问我是哪里理解错了呢?
(另外,个人对于套接字的理解是:套接字实际上就是将一个进程的地址信息(包括ip、端口等)具体化,来使得进程成为一个可连接对象,不知道这样的理解是否有误?)
十分感谢!!!
一个连接有两个端点,服务端一个,客户端一个,没毛病啊。
而
serversocket
是一个特殊的socket,它可以监听和接受客户端的连接,接受之后就会返回一个具体的连接。