正文

C++网络编程学习笔记2007-03-05 18:42:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/12567/23686.html

分享到:

1、IP网络中的每台主机都有一个IP地址;
   它是逻辑地址;
   因特网上的IP地址具有全球唯一性;
   4个字节,192.168.0.16
2、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端口   
  
  
  

阅读(4568) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册