Linux C网络编程的一点总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hello_world12138/article/details/51530754

以下仅个人总结,望网友指正。


我做的是,实现客户端与客户端之间互相通信,这样也算基本搭起来了,之前也做过一个即时通讯软件的项目,现在温习一下,所以点到为止。

1.      网络结构的标准模型是OSI模型,由ISO国际互联网标准化组织定义的网络分层模型。

2.      ISO/OSI七层网络模型:应用层---表示层---会话层---传输层---网络层---数据链路层---网络层

3.      TCP/IP四层参考模型:应用层---传输层----网络互联层---主机到网络

4.      ARP(地址解析协议):完成IP地址和硬件地址的对应关系。

 

 

 

客户端/服务器网络编程注意点

 

服务器端

1.      首先创建套接字,调用的函数为socket(),参数使用的一般为IPv4 Internet协议,和套接字类型为流式套接字(套接字的类型有:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)(主要用于UDP连接)及原始套接字  ),流式套接字用于TCP连接,提供序列化的,可靠的,双向连接的字节流。

2.      在创建套接字成功以后,也就是得到了套接字的id,这时候就可以开始bind(),对套接字地址和端口进行绑定,才能进行数据的接收和发送。

3.      绑定函数中,使用的第一个参数为套接字fd,第二个为一个套接字的地址结构,那么相对于AF_INET的域,我们使用结构体struct sockaddr_in这个结构体     

4.       struct sockaddr_in{ 
       short int            sin_family; /* 地址族 */ 
       unsigned short int      sin_port;/* 端口号 */ 
       struct in_addr            sin_addr; /*IP地址 */ 
       unsigned char           sin_zero[8]; /*填充0 以保持与struct sockaddr同样大小 */ 
       }; 

struct sockaddr { 
        unsignedshort       sa_family; /* 地址族, AF_xxx */ 
            char                       sa_data[14]; /* 14 字节的协议地址 */
          }; 

5.      好处在于,这个结构体可以在第四个成员中填充0,使之与scokaddr结构体一样大小,这样就可以完成两种结构体的类型的转换。

6.      下一步就是将这个结构体清空,然后在里面填充重要的网络信息,有域,端口和ip地址,端口和ip地址需要使用函数进行转化,比如:端口需要使用htons()将端口的字节顺序转化为网络的字节顺序(大端存储),因为主机的字节顺序有时候大端有时候小端,然后还有一个inet_addr()函数,使用这个函数,将例如192.168.1.1这样的字符串ip地址转化为二进制数据给结构体,让绑定的时候能够正确辨识。

7.      接下来是监听,也就是listen(),参数为套接字的fd和设置的监听队列的长度。

8.      再就是开始循环的接收accept(),这个函数有一个特点,就是接收完了,那么这时候会返回一个新的套接字,这个新的套接字就是客户端连接请求是客户端的套接字文件描述符fd,然后旧的,也就是原来服务器创建的那个套接字还是在不断的监听和接收,新的套接字就可以通过send()和recv()函数,再新的套接字基础上进行数据的收发。

9.      在accept成功以后,就要在服务器端开启一个线程,这样就可以单独的去处理某一个客户端的请求操作。

10.  这时候可以使用传参的方式,把新的客户端的套接字进行传入给线程的执行单元,这样就能让线程依靠这个套接字描述符进行和该客户端的通信了。

11.  那么如何通信呢?我们使用不带缓冲的IO操作,write和read,进行对套接字为文件描述符的操作,反正Linux下皆为文件。

12.  这时候出现一个问题,就是阻塞问题,阻塞是一般我们自己写服务器和客户端使用的方法,因为比较好用,也比较能够理清逻辑,但是我觉得阻塞是不合理的,不能让线程停在一个地方。所以这个问题需要考虑。

13.  第二个问题就是如何实现信号的处理,如何将组合键让服务器获取,然后做出正确的退出等操作。

 

 

 

 

 

 

客户端

1.      首先创建套接字

2.      然后使用套接字进行连接connect(),如果连接上了服务器就可以开始做客户端做的操作了。

3.      客户端的操作可以放在一个函数中,这个函数中为循环的做一件事情,可以使用轮询的方式,不断的write和read,这样达到了阻塞型的客户端。

4.      阻塞问题这是问题,需要解决,但是阻塞有阻塞的坏处,不阻塞也有不阻塞的坏处。


猜你喜欢

转载自blog.csdn.net/hello_world12138/article/details/51530754
今日推荐