VC Socket网络通信

时间:2022-12-22 19:00:51



1. 与对方通信,第一你必须知道与谁通信,即对方的名字,对于计算机来说就是主机名或IP地址;第二双方必须遵守约定的规则,不能一个讲英语,一个讲汉语,即通信协议必须遵守,(TCP/IP),多个应用程序,每个均有一个端口号。IP地址相当于一个公司的总机号码,端口号相当于分机号码。

2. 分层,物理层,数据链路层,网络层,传输层,应用层,,,

3. 应用层协议:Telnet,FTP,HTTP,DNS,SMTP. 传输层:TCP/UDP;物理层:IP,ICMP。

4. TCP 面向连接的可靠地传输协议;三次握手;数据确认和数据重传机制。打电话,连接建立。应用在数据完整性较高场合。

UDP:无连接的不可靠的通讯协议。寄信。实时性高!!!

5. 数据打包,封装,到达传输层加上TCP协议头,到达网络层加上IP协议头。

如寄信,一层加上一个信封,到达后一层一层拆封。

6. TCP/IP 模型:应用层,传输层,网络层,网络接口层。

端口是一种抽象的软件结构(包括一些数据结构和IO缓冲区)。0-65535(>1024)

7. 流式套接字:基于可靠地TCP协议;数据报式套接字:基于UDP协议。

8. TCP 服务端程序流程:

创建套接字;将套接字绑定到一个本地地址和端口上(bind);将套接字设为监听模式。准备接收客户端请求(Listen);等待请求到来,当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept);用返回的套接字和客户端进行通信(send/recv);返回,等待另一客户请求。

9.  TCP客户端程序流程:

创建套接字;向服务器发出连接请求(connect);和服务器进行通信(send/recv);关闭套接字。

当调用accept函数后,服务端等待客户端connect。客户端并不需要bind函数。

UDP服务器:创建套接字;绑定IP和端口bind,等待接收数据recvfrom,关闭套接字;

UDP客户端:创建套接字,向服务器发送数据sendto,关闭套接字。

10. //1.加载套接字库

WSADATA wsaData;

WORD version = MAKEWORD(2, 2);//2.2

int ret = ::WSAStartup(version, &wsaData);

if(ret

MessageBox("Socket初始化失败!","九洲迪飞");

return;

}

//2. 创建套接字 

SOCKET m_hSocket = ::socket(AF_INET, SOCK_STREAM,0);

::WSAAsyncSelect(m_hSocket,this->m_hWnd,WM_SOCKET,FD_READ|FD_CONNECT);//将套接字设为异步模式 

最后释放资源:

if (WSACleanup() != 0){

TRACE("UnInitilize Error:%d\n", WSAGetLastError());

}

11. Just Do It!!!



Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。其定义类似于文件句柄的定义。 
原始套接字保存了数据包中的完整IP头,前面两种套接字只能收到用户数据。因此可以通过原始套接字对数据进行分析。 


旧的网络地址结构的定义 in_addr 
新的网络地址结构的定义: #define INADDR_LOOPBACK 0x7f000001
套接字的使用步骤 
1、启动Winsock WSAStartup
2、创建套接字:(服务器端和客户端) 
m_hSocket = ::socket(AF_INET, SOCK_STREAM,0);
3、套接字的绑定:将本地地址绑定到所创建的套接字上。(服务器端和客户端) bind 
4、 套接字的监听:(服务器端) listen
5、套接字等待连接::(服务器端) accept
6、套接字的连结:将两个套接字连结起来准备通信。(客户端) connect
7、套接字发送数据:(服务器端和客户端) send
8、 套接字的数据接收:(客户端) recv
9、中断套接字连接:通知服务器端或客户端停止接收和发送数据。(服务器端和客户端)shutdown 
10、 关闭套接字:释放所占有的资源。(服务器端和客户端) closesocket


WSAGetLastError,
阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序。套接字 默认为阻塞模式。可以通过多线程技术进行处理。 
非阻塞模式:执行I/O操作时,Winsock函数会返回并交出控制权。这种模式使用起来比较复杂,因为函数在没有运行完成就进行返回,
会不断地返回 WSAEWOULDBLOCK错误。但功能强大。 
为了解决这个问题,提出了进行I/O操作的一些I/O模型,下面介绍最常见的三种: 


2、select模型: 3、WSAAsynSelect模型: 4、WSAEventSelect模型