Linux下的TCP编程

学习tcp前要牢记的基础通信模型

TCP

Linux下的TCP编程

按照通信模型编程序的话不会出现大的逻辑错误。

TCP编程

对于服务器:创建自己的套接字(我的理解:套接字相当于一个文件返回一个INT型的文件描述符)然后是初始化本机的地址结构体。然后是使用bind()绑定套接字和地址结构体;对于TCP需使用lisent()设置服务器最大连接数(int);使用accept()阻塞程序直到有客户端请求连接。连接连接成功后即可使用write和read或者send和recv与客户端进行通信交流。

对于客户端:创建自己的套接字后直接初始化目标机结构体,然后使用connet()参数包括本机socket描述符和目标机地址结构。返回0,代表连接成功,即可使用write和read或者send和recv与服务器进行通信交流。

注意:1.虽然addr_server.sin_addr.s_addr = htonl(INADDR_ANY);经常被使用。INADDR_ANY代表任何IP地址,但是在服务器端本结构体确实是代表本机IP。在这里INADDR_ANY可以理解为服务器可接受本网任何IP的连接。

           2.注意accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)和connect(SOCKET s, const struct sockaddr * name, int namelen)两个函数的第二个参数一定是struct sockaddr 的指针。一般是定义一个struct sockaddr addr_server然后传参时用(struct sockaddr *)(&addr_server),如果直接定义struct sockaddr *addr传参用addr会出错。(还没搞懂为啥)

          3.想在客户端连接指定ip的话最好用inet_aton("172.18.71.63",&server_addr.sin_addr)的形式初始化地址结构。不要先转换再强制类型转化初始化。一不小心就会出错。

          4.如果想服务器客户两端进行多次通信的话,一定把accept()放在通信循环的之前,而不知那个while里面。放在循环里面的的话,程序即使接收到来自同一客户端的连接请求,也会认为这是一个新的连接而响应。有类似的错误时,双方通信的次数收lisent()函数的参数的影响。