zoukankan      html  css  js  c++  java
  • 网络编程

    基于TCPsocket编程:

    基于UDPsocket编程:

    1.基于TCP连接的服务器客户端程序

    新建一个win32 console application ,工程名为TCPSrv,再添加一个源程序,取名也为TCPSrv.

    服务端程序:

    因为要用到win32 套接字的函数,所以要在头文件中包含Winsock2.h这个头文件,并在project -> Setting -> Link -> Object/library modules中添加ws2_32.lib 库文件。编辑TCPSrv.cpp文件:

    //TCPSrv.cpp

    #include <stdio.h> 
    #include <Winsock2.h> 
     
    void main() 

        WORD wVersionRequested; 
        WSADATA wsaData; 
        int err; 
      
        wVersionRequested = MAKEWORD( 11 );//
    请求一个1.1版本的socket 
      
        err = WSAStartup( wVersionRequested, &wsaData ); 
        if ( err != 0 )  
        { 
            return
        } 
        if ( LOBYTE( wsaData.wVersion ) != 1 || //
    低字节是否为
                HIBYTE( wsaData.wVersion ) != 1 )  //
    高字节是否也为
        { 
            WSACleanup( );//
    终止对winsocket的使用 
            return;  
        } 
        SOCKET    sockSrv=socket(AF_INET,SOCK_STREAM,0); 
        //
    创建一个服务端的套接字 
        SOCKADDR_IN addrSrv;//
    定义一个地址结构体变量 
        addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//
    对这个地址结构体的成员赋值 
        //
    将主机字节序转换成u_long类型的网络字节序 
        addrSrv.sin_family=AF_INET;//
    指定地址簇 
        addrSrv.sin_port=htons(6000);//
    指定端口号 
        bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//
    绑定套接字 
        listen(sockSrv,5);//
    设置套接字为监听模式,5代表等待连接队列的最大为
     
        SOCKADDR_IN addrClient;//
    用来接收客户端的地址信息 
        int len=sizeof(SOCKADDR);//
    获得这个结构体的长度 
        while(1//
    保证能够不断接收客户端请求的到来 
        { 
            SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); 
            //
    接收套接字的请求 
            char sendBuf[100];//
    定义一个Buf字符数组 
            sprintf(sendBuf,"Welcom %s to http://www.luowei.org"
                inet_ntoa(addrClient.sin_addr));//
    将要发送的数据格式化到Buf当中 
            //inet_ntoa
    接收一个in_addr类型的参数,返回一个点分十进制表示的IP地址的字符串 
            send(sockConn,sendBuf,strlen(sendBuf)+1,0);//
    发送数据 
            char recvBuf[100];//
    定义一个用来接收的字符数组 
    recv(sockConn,recvBuf,100,0);//接收数据
            printf("%s\n",recvBuf); 
            closesocket(sockConn);//
    关闭套接字,释放为这个套接字所分配的资源 
        } 
    }

    客户端程序:

    Workspace 'TCPSrv'上点右键 -> Add New Project To Workspace… , 选择win32 console application ,工程名为TCPClient,目录放到TCPClient下,再添加一个源程序,取名也为TCPClient。编辑:

    #include <stdio.h> 
    #include <Winsock2.h> 
    #pragma comment(lib, "Ws2_32.lib"
     
    void main() 

        WORD wVersionRequested; 
        WSADATA wsaData; 
        int err; 
      
        wVersionRequested = MAKEWORD( 11 );//
    请求一个1.1版本的socket 
      
        err = WSAStartup( wVersionRequested, &wsaData ); 
        if ( err != 0 )  
        { 
            return
        } 
        if ( LOBYTE( wsaData.wVersion ) != 1 || //
    低字节是否为
                HIBYTE( wsaData.wVersion ) != 1 )  //
    高字节是否也为
        { 
            WSACleanup( );//
    终止对winsocket的使用 
            return;  
        } 
        SOCKET sockClient=socket(AF_INET,SOCK_STREAM,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(6000); 
        connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//
    连接 
     
        char recvBuf[100]; 
        recv(sockClient,recvBuf,100,0); 
        printf("%s\n",recvBuf); 
        send(sockClient,"This is luowei_Client",strlen("This is luowei_Client")+1,0); 
        //
    发送消息 
     
        closesocket(sockClient); 
        WSACleanup();//
    止对套接字库的使用 
    }

    运行,OK !

    2.基于TCP连接的服务器客户端程序

    新建一个win32 console application ,工程名为UDPSrv,再添加一个源程序,取名也为UDPSrv.

    服务端程序:

    因为要用到win32 套接字的函数,所以要在头文件中包含Winsock2.h这个头文件,并在project -> Setting -> Link -> Object/library modules中添加ws2_32.lib 库文件。编辑UDPSrv.cpp文件:

    #include <stdio.h>  
    #include <Winsock2.h>  
    #pragma comment(lib, "Ws2_32.lib")  
      
    void main()  
    {  
        WORD wVersionRequested;  
        WSADATA wsaData;  
        int err;  
       
        wVersionRequested = MAKEWORD( 11 );//
    请求一个1.1版本的socket  
       
        err = WSAStartup( wVersionRequested, &wsaData );  
        if ( err != 0 )   
        {  
            return;  
        }  
        if ( LOBYTE( wsaData.wVersion ) != 1 || //
    低字节是否为1  
                HIBYTE( wsaData.wVersion ) != 1 )  //
    高字节是否也为1  
        {  
            WSACleanup( );//
    终止对winsocket的使用  
            return;   
        }  
        SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); 
        //
    创建一个服务端的套接字 
        SOCKADDR_IN addrSrv;//
    定义一个地址结构体变量 
        addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 
        //
    对这个地址结构体的成员赋值 
        //htonl
    将主机字节序转换成u_long类型的网络字节序 
        addrSrv.sin_family=AF_INET;//
    指定地址簇 
        addrSrv.sin_port=htons(6000);//
    指定端口号 
     
        bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); 
     
        SOCKADDR_IN addrClient;//
    定义一个地址结构变量,用来接收发送方的地址信息 
        int len=sizeof(SOCKADDR); 
        char recvBuf[100]; 
     
        recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); 
        //
    接收数据 
        printf("%s\n",recvBuf); 
        closesocket(sockSrv); 
        WSACleanup(); 
    }

    客户端程序:

    Workspace 'UDPSrv'上点右键 -> Add New Project To Workspace… , 选择win32 console application ,工程名为UDPClient,目录放到UDPClient下,再添加一个源程序,取名也为UDPClient。编辑:

    #include <stdio.h>  
    #include <Winsock2.h>  
    #pragma comment(lib, "Ws2_32.lib")  
      
    void main()  
    {  
        WORD wVersionRequested;  
        WSADATA wsaData;  
        int err;  
       
        wVersionRequested = MAKEWORD( 11 );//
    请求一个1.1版本的socket  
       
        err = WSAStartup( wVersionRequested, &wsaData );  
        if ( err != 0 )   
        {  
            return;  
        }  
        if ( LOBYTE( wsaData.wVersion ) != 1 || //
    低字节是否为1  
                HIBYTE( wsaData.wVersion ) != 1 )  //
    高字节是否也为1  
        {  
            WSACleanup( );//
    终止对winsocket的使用  
            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"); 
        //
    对这个地址结构体的成员赋值 
        //hto
    将主机字节序转换成u_long类型的网络字节序 
        addrSrv.sin_family=AF_INET;//
    指定地址簇 
        addrSrv.sin_port=htons(6000);//
    指定端口号 
     
        sendto(sockClient,"Hello",strlen("Hello")+1,0
            (SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); 
     
        closesocket(sockClient); 
        WSACleanup(); 
    }

    3.简单的聊天程序

    新建一个win32 console application ,工程名为NetSrv,再添加一个源程序,取名也为NetSrv.

    服务端程序:

    因为要用到win32 套接字的函数,所以要在头文件中包含Winsock2.h这个头文件,并添加ws2_32.lib 库文件。编辑NetSrv.cpp文件:

    #include <stdio.h>  
    #include <Winsock2.h>  
    #pragma comment(lib, "Ws2_32.lib")  
      
    void main()  
    {  
        WORD wVersionRequested;  
        WSADATA wsaData;  
        int err;  
       
        wVersionRequested = MAKEWORD( 11 );//
    请求一个1.1版本的socket  
       
        err = WSAStartup( wVersionRequested, &wsaData );  
        if ( err != 0 )   
        {  
            return;  
        }  
        if ( LOBYTE( wsaData.wVersion ) != 1 || //
    低字节是否为1  
                HIBYTE( wsaData.wVersion ) != 1 )  //
    高字节是否也为1  
        {  
            WSACleanup( );//
    终止对winsocket的使用  
            return;   
        }  
        SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); 
        //
    创建一个服务端的套接字 
        SOCKADDR_IN addrSrv;//
    定义一个地址结构体变量 
        addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 
        //
    对这个地址结构体的成员赋值 
        //htonl
    将主机字节序转换成u_long类型的网络字节序 
        addrSrv.sin_family=AF_INET;//
    指定地址簇 
        addrSrv.sin_port=htons(6000);//
    指定端口号 
     
        bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); 
     
        char recvBuf[100]; 
        char sendBuf[100]; 
        char tempBuf[200]; 
     
        SOCKADDR_IN addrClient; 
        int len=sizeof(SOCKADDR); 
     
        while(1
        { 
            recvfrom(sockSrv,recvBuf,100,0
                (SOCKADDR*)&addrClient,&len); 
            if('q'==recvBuf[0])//
    如果接收的字符是
            { 
                sendto(sockSrv,"q",strlen("q")+1,0
                    (SOCKADDR*)&addrClient,len); 
                printf("Chat end!\n"); 
                break;//
    退出循环 
            } 
            sprintf(tempBuf,"%s say: %s",inet_ntoa(addrClient.sin_addr),recvBuf); 
            printf("%s\n",tempBuf);//
    把接收的数据放置tempBuf当中,并打印输出 
            printf("Please input data:\n"); 
            gets(sendBuf);//
    读取一行数据 
            sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len); 
            //
    把数据发送给客户端 
        } 
        closesocket(sockSrv); 
        WSACleanup(); 
    }
     

    客户端程序:

    Workspace 'NetSrv'上点右键 -> Add New Project To Workspace… , 选择win32 console application ,工程名为NetClient,目录放到NetClient下,再添加一个源程序,取名也为NetClient。编辑:

    #include <stdio.h>  
    #include <Winsock2.h>  
    #pragma comment(lib, "Ws2_32.lib")  
      
    void main()  
    {  
        WORD wVersionRequested;  
        WSADATA wsaData;  
        int err;  
       
        wVersionRequested = MAKEWORD( 11 );//
    请求一个1.1版本的socket  
       
        err = WSAStartup( wVersionRequested, &wsaData );  
        if ( err != 0 )   
        {  
            return;  
        }  
        if ( LOBYTE( wsaData.wVersion ) != 1 || //
    低字节是否为1  
                HIBYTE( wsaData.wVersion ) != 1 )  //
    高字节是否也为1  
        {  
            WSACleanup( );//
    终止对winsocket的使用  
            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"); 
        //
    对这个地址结构体的成员赋值 
        //htonl
    将主机字节序转换成u_long类型的网络字节序 
        addrSrv.sin_family=AF_INET;//
    指定地址簇 
        addrSrv.sin_port=htons(6000);//
    指定端口号 
         
        char recvBuf[100]; 
        char sendBuf[100]; 
        char tempBuf[200]; 
     
        int len=sizeof(SOCKADDR); 
        while(1
        { 
            printf("Please input data:\n"); 
            gets(sendBuf); 
            sendto(sockClient,sendBuf,strlen(sendBuf)+1,0
                (SOCKADDR*)&addrSrv,len); 
            recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len); 
            if('q'==recvBuf[0]) 
            { 
                sendto(sockClient,"q",strlen("q")+1,0
                (SOCKADDR*)&addrSrv,len); 
                printf("Chat end!\n"); 
                break;//
    退出循环 
            } 
            sprintf(tempBuf,"%s say :%s",inet_ntoa(addrSrv.sin_addr),recvBuf); 
            printf("%s\n",tempBuf); 
        } 
        closesocket(sockClient); 
        WSACleanup(); 
    }

    运行 OK !!!

  • 相关阅读:
    zhanwei
    站位
    Web前端开发:SQL Jsp小项目(二)------添加修改
    Web前端开发:SQL Jsp小项目(一)
    JDBC(用Eclipse操作数据库Oracle)的基础操作集合
    Thread多线程stopSleep顺序问题
    IO流详解之代码详解
    IO流详解(半教材类型)
    用JQuery编写textarea,input,checkbox,select
    Java编写ArrayBasic制作一个简单的酒店管理系统
  • 原文地址:https://www.cnblogs.com/luowei010101/p/2030824.html
Copyright © 2011-2022 走看看