1、IP网络中的每台主机都有一个IP地址; 它是逻辑地址; 因特网上的IP地址具有全球唯一性; 4个字节,192.168.0.162、OSI将网络分为 TCP/IP模型 应用层 应用层 表示层 会话层 传输层 传输层 网络层 网络层 数据链路层 网络接口 物理层 相同层次之间不可以直接通信,是虚拟通信。下层向上层提供服务,实际通信在最底层完成。各层之 间单向依赖。3、DNS是将DNS解析为IP地址。 应用层:Telnet、FTP、HTTP、DNS、SMTP、POP3。 传输层:TCP实现数据的完整性,例如下载安装包;UDP实现数据的及时性,例如网络视频电话。4、数据封装:在数据前面加上特定的协议头部。5、TCP和UDP可以使用同样的端口,1024以下的端口保留给预定义的服务。windows socket只支持 AF_INET网际域.6、在网络协议中需要指定网络字节顺序,TCP/IP使用16位整数和32位整数的高位先存格式,PC机采用的 是低位先存格式。套接字:流式套接字(基于TCP)、数据报套接字(基于UDP),原始套接字。7、基于TCP的socket编程 服务器端程序: 创建套接字; 将套接字绑定到一个本地地址和端口上bind 将套接字设为监听模式,准备接受客户请求listen 等待客户请求,当请求到来,返回一个新的对应于此次连接的套接字accept 用返回的套接字和客户端进行通信send/recv。 返回,等待另一客户的请求。 关闭套接字。 客户端程序: 创建套接字; 向服务器发送连接请求connect 和服务器进行通信send/recv 关闭套接字。8、基于UDP的socket编程 服务器端(接收端)程序: 创建套接字 绑定套接字到本地地址和端口上bind 等待接受数据recvfrom 关闭套接字 客户端(发送端)程序: 创建套接字 发送数据sendto 关闭套接字9、Alt+F8实现代码的整齐。10、127.0.0.1是回路地址。可以在同一台机子上通信。11、将两个工程添加到一个工作区中,在工作区中点右键"添加工程"。取消"编译微型条",选中"组建".12、基于TCP/IP的socket代码:/*Server.cpp*/#include<winsock2.h>#include<stdio.h> void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); //加载套接字DLL库 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { //终止使用套接字DLL库 WSACleanup( ); return; } //1、创建套接字 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); /*第一个参数对于TCP/IP协议的套接字,只能是AF_INET或PF_INET,第二个参数对于 1.1版本的socket,只支持两种类型的套接字,SOCK_STREAM指定产生流式套接字, SOCK_DGRAM产生数据报套接字,第三个参数为零时自动选择合适的协议。*/ //2、绑定套接字到一个本地地址和端口上 SOCKADDR_IN addSrv; //htonl是把u_long类型转换为网络字节序 //htons是把u_short类型转换为网络字节序 addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addSrv.sin_family=AF_INET; //unsigned short sin_port; addSrv.sin_port=htons(4000); bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR)); //3、将套接字设为监听模式,准备接受客户请求 listen(sockSrv,5); SOCKADDR_IN addClient; int len=sizeof(SOCKADDR); while(1) { SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addClient,&len); //accept函数第三个参数必须赋初始值,初始值为结构体的长度。否则函数调用失败 。 //4、用返回的套接字和客户端进行通信 char sendBuf[100]; sprintf(sendBuf,"hello,haha %s",inet_ntoa(addClient.sin_addr)); //inet_ntoa函数是将网络IP地址转换为字符串 send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100]; recv(sockConn,recvBuf,100,0); printf("%s\n",recvBuf); //4、关闭套接字 closesocket(sockConn); }} /*Client.cpp*/#include <stdio.h>#include <Winsock2.h>void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } //1、创建套接字 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); //2、向服务器发送连接请求 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置SOCKET的IP为本机。 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(4000);//端口为4000,服务端和客户端的端口一定要相同.否则是连不 上的 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//根据addrSrv连接服务端 //3、和服务器进行通信 char recvBuf[100]; recv(sockClient,recvBuf,100,0);//接收100字符 printf("%s\n",recvBuf); //显示 send(sockClient,"hello",strlen("hello")+1,0); //发送一个hello //4、关闭套接字 closesocket(sockClient); //关闭 WSACleanup(); //清理} 13、基于UDP/IP的socket代码:/*Server.cpp*/#include<winsock2.h>#include<stdio.h> void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); //加载套接字DLL库 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { //终止使用套接字DLL库 WSACleanup( ); return; } SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(4001); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); char recvBuf[50]; recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len); printf("%s\n",recvBuf); closesocket(sockSrv); WSACleanup();} /*Client.cpp*/#include<winsock2.h>#include<stdio.h> void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); //加载套接字DLL库 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { //终止使用套接字DLL库 WSACleanup( ); return; } SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(4001); sendto(sockClient,"hello",strlen("hello")+1,0, (SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); closesocket(sockClient); WSACleanup();}QQ一般都是8080端口或者4000端口

评论