• Socket网络编程:互相通讯


    基于UDP的Windows通信

    客户端:

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    
    #define SERVERIP "127.0.0.1"
    #define SERVER_PORT 23333
    #define BUFSIZ 4096
    int main()
    {
        printf("【客户端:目标IP 127.0.0.1,目标端口:23333】
    
    ");
        //初始化Winsock DLL
        int ret;
        WORD sockertVersion=MAKEWORD(2, 2);
        WSADATA wsaData;
        ret = WSAStartup(sockertVersion, &wsaData);
        if(ret!=0)
        {
            printf("无法打开winsock.dll!
    ");
            exit(-1);
        }
        //创建socket
        SOCKET tsocket = socket(AF_INET, SOCK_DGRAM, 0);
        if(tsocket == INVALID_SOCKET)
        {
            printf("创建socket失败!");
            exit(-1);
        }
        //绑定和发送数据
        char buffer[BUFSIZ];
        printf("输入数据>>");
        scanf("%s",buffer);
        struct sockaddr_in servaddr;
        ZeroMemory(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr=inet_addr(SERVERIP);
        servaddr.sin_port = htons(SERVER_PORT);
        int num=0;
        int len = sizeof(struct sockaddr_in);
        num = sendto(tsocket,buffer, strlen(buffer) , 0, (struct sockaddr*)&servaddr, len);
        if(num!=strlen(buffer))
        {
            printf("发送数据失败!");
            exit(-1);
        }
        //接收数据
        char buf[BUFSIZ];
        num=0;
        struct sockaddr_in clientaddr;
        ZeroMemory(&clientaddr,sizeof(clientaddr));
        ZeroMemory(buf,sizeof(buf));
        num = recvfrom(tsocket,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&len);
        if(num<0)
        {
            printf("接收数据失败");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
        closesocket(tsocket);
    
        WSACleanup();
        system("pause");
    
        return 0;
    }

    客户端2.0:

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    char *SERVERIP="127.0.0.1";
    int SERVER_PORT=23334;
    int my_BUFSIZ=4096;
    void binner()
    {
    
        printf("    _  _  _  _           _           _        _           _ 
    ");
        printf("   (_)(_)(_)(_) _       (_)_       _(_)      (_)_       _(_)
    ");
        printf("   (_)         (_)        (_)_   _(_)          (_)_   _(_)  
    ");
        printf("   (_) _  _  _ (_)          (_)_(_)              (_)_(_)    
    ");
        printf("   (_)(_)(_)(_)              _(_)_                 (_)      
    ");
        printf("   (_)   (_) _             _(_) (_)_               (_)      
    ");
        printf("   (_)      (_) _        _(_)     (_)_             (_)      
    ");
        printf("   (_)         (_)      (_)         (_)            (_)      
    ");
        printf("                                                            
    ");
    }
    int main(int argc,char *argv[])
    {
        binner();
        if(argc>1)
        {
            if(strcmp(argv[1],"-h")==0)
            {
                printf("
    使用说明:
    ");
                printf("-h:帮助 
    ");
                printf("-l:服务器地址,默认127.0.0.1
    ");
                printf("-p:端口,默认23334 
    ");
                printf("-b:发送数据大小,默认4096
    ");
                exit(-1);
            }
            for(int i=1;i<argc;++i)
            {
                if(strcmp(argv[i],"-p")==0)
                {
                    SERVER_PORT=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-b")==0)
                {
                    my_BUFSIZ=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-l")==0)
                {
                    SERVERIP = argv[i+1];
                }
            }
        }
        printf("【客户端:目标IP %s,监听端口 %d,发送数据大小:%d】
    
    ",SERVERIP,SERVER_PORT,my_BUFSIZ);
        //初始化Winsock DLL
        int ret;
        WORD sockertVersion=MAKEWORD(2, 2);
        WSADATA wsaData;
        ret = WSAStartup(sockertVersion, &wsaData);
        if(ret!=0)
        {
            printf("无法打开winsock.dll!
    ");
            exit(-1);
        }
        //创建socket
        SOCKET tsocket = socket(AF_INET, SOCK_DGRAM, 0);
        if(tsocket == INVALID_SOCKET)
        {
            printf("创建socket失败!");
            exit(-1);
        }
        //绑定和发送数据
        char buffer[my_BUFSIZ];
        printf("输入数据>>");
        gets(buffer);
    
        struct sockaddr_in servaddr;
        ZeroMemory(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr=inet_addr(SERVERIP);
        servaddr.sin_port = htons(SERVER_PORT);
        int num=0;
        int len = sizeof(struct sockaddr_in);
        num = sendto(tsocket,buffer, strlen(buffer) , 0, (struct sockaddr*)&servaddr, len);
        if(num!=strlen(buffer))
        {
            printf("发送数据失败!");
            exit(-1);
        }
        //接收数据
        char buf[my_BUFSIZ];
        ZeroMemory(buf,sizeof(buf));
        num=0;
        struct sockaddr_in clientaddr;
        ZeroMemory(&clientaddr,sizeof(clientaddr));
    
        num = recvfrom(tsocket,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&len);
        if(num<0)
        {
            printf("接收数据失败");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
        closesocket(tsocket);
    
        WSACleanup();
        system("pause");
    
        return 0;
    }

    服务器端:

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    
    #define BUFSIZ 4096
    #define SERVER_PORT 23333
    int main()
    {
        printf("【服务端:监听端口 23333】
    
    ");
        //步骤1:使用WSAStartup函数初始化Winsock DLL;
        WORD scoketVersion;
        scoketVersion = MAKEWORD(2, 2);
        WSADATA wsaData;
        int ret = WSAStartup(scoketVersion, &wsaData);
        if(ret != 0 )
        {
            printf("无法打开 winsock.dll!
    ");
            exit(-1);
        }
        //步骤2:调用socket函数创建服务器端UDP套接字;
        SOCKET msock;
        msock = socket(AF_INET, SOCK_DGRAM, 0);
        if(msock == INVALID_SOCKET)
        {
            printf("创建socket失败!");
            exit(-1);
        }
        //步骤3:调用bind()函数将该UDP套接字绑定到本机的一个可用的端点地址:
    
        struct sockaddr_in servaddr;
        ZeroMemory(&servaddr,sizeof(servaddr));
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVER_PORT);
        if(bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in))< 0)
        {
            printf("绑定服务器端口:%d失败
    ",SERVER_PORT);
            exit(-1);
        }
        //步骤4:调用revfrom函数从该UDP套接字接收来自远程客户端的数据并存入缓冲区,同时获得远程客户端的套接字端点地址并保存;
        char buf[BUFSIZ];
        int num=0;
        struct sockaddr_in clientaddr;
        int len = sizeof(clientaddr);
        ZeroMemory(&clientaddr,sizeof(clientaddr));
        ZeroMemory(buf,sizeof(buf));
        num = recvfrom(msock, buf, sizeof(buf), 0, (struct sockaddr*)&clientaddr, &len);
        if(num<0)
        {
            printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
    
        //步骤5:基于保存的远程客户端的套接字端点地址,调用sendto()函 数将缓冲区中的数据从该UDP套接字发送给该远程客户端;
        ZeroMemory(buf,sizeof(buf));
        printf("输入数据>>");
        scanf("%s",buf);
        if(sendto(msock,buf,strlen(buf),0,(struct sockaddr*)&clientaddr,len)<0)
        {
            printf("发送数据失败!");
            exit(-1);
        }
        //步骤6:与客户交互完毕,调用closesocket()函数将该UDP套接字关闭,释放所占用的系统资源;
        closesocket(msock);
        //步骤7:最后,调用WSACleanup0函数结束Winsock Socket API。
        WSACleanup();
    
        system("pause");
    
        return 0;
    }

    服务器端2.0:

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    int  my_BUFSIZ=4096;
    int  SERVER_PORT=23334;
    void binner()
    {
    
        printf("    _  _  _  _           _           _        _           _ 
    ");
        printf("   (_)(_)(_)(_) _       (_)_       _(_)      (_)_       _(_)
    ");
        printf("   (_)         (_)        (_)_   _(_)          (_)_   _(_)  
    ");
        printf("   (_) _  _  _ (_)          (_)_(_)              (_)_(_)    
    ");
        printf("   (_)(_)(_)(_)              _(_)_                 (_)      
    ");
        printf("   (_)   (_) _             _(_) (_)_               (_)      
    ");
        printf("   (_)      (_) _        _(_)     (_)_             (_)      
    ");
        printf("   (_)         (_)      (_)         (_)            (_)      
    ");
        printf("                                                            
    ");
    }
    int main(int argc,char *argv[])
    {
        binner();
        if(argc>1)
        {
            if(strcmp(argv[1],"-h")==0)
            {
                printf("
    使用说明:
    ");
                printf("-h:帮助 
    ");
                printf("-p:端口,默认23334 
    ");
                printf("-b:发送数据大小,默认4096
    ");
                exit(-1);
            }
            for(int i=1;i<argc;++i)
            {
                if(strcmp(argv[i],"-p")==0)
                {
                    SERVER_PORT=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-b")==0)
                {
                    my_BUFSIZ=atoi(argv[i+1]);
                }
            }
        }
        printf("【服务端:监听端口 %d,发送数据大小:%d】
    
    ",SERVER_PORT,my_BUFSIZ);
        //步骤1:使用WSAStartup函数初始化Winsock DLL;
        WORD scoketVersion;
        scoketVersion = MAKEWORD(2, 2);
        WSADATA wsaData;
        int ret = WSAStartup(scoketVersion, &wsaData);
        if(ret != 0 )
        {
            printf("无法打开 winsock.dll!
    ");
            exit(-1);
        }
        //步骤2:调用socket函数创建服务器端UDP套接字;
        SOCKET msock;
        msock = socket(AF_INET, SOCK_DGRAM, 0);
        if(msock == INVALID_SOCKET)
        {
            printf("创建socket失败!");
            exit(-1);
        }
        //步骤3:调用bind()函数将该UDP套接字绑定到本机的一个可用的端点地址:
    
        struct sockaddr_in servaddr;
        ZeroMemory(&servaddr,sizeof(servaddr));
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVER_PORT);
        if(bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in))< 0)
        {
            printf("绑定服务器端口:%d失败
    ",SERVER_PORT);
            exit(-1);
        }
        //步骤4:调用revfrom函数从该UDP套接字接收来自远程客户端的数据并存入缓冲区,同时获得远程客户端的套接字端点地址并保存;
        char buf[my_BUFSIZ];
        int num=0;
        struct sockaddr_in clientaddr;
        int len = sizeof(clientaddr);
        ZeroMemory(&clientaddr,sizeof(clientaddr));
        ZeroMemory(buf,sizeof(buf));
        num = recvfrom(msock, buf, sizeof(buf), 0, (struct sockaddr*)&clientaddr, &len);
        if(num<0)
        {
            printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
    
        //步骤5:基于保存的远程客户端的套接字端点地址,调用sendto()函 数将缓冲区中的数据从该UDP套接字发送给该远程客户端;
        ZeroMemory(buf,sizeof(buf));
        printf("输入数据>>");
        gets(buf);
        if(sendto(msock,buf,strlen(buf),0,(struct sockaddr*)&clientaddr,len)<0)
        {
            printf("发送数据失败!");
            exit(-1);
        }
        //步骤6:与客户交互完毕,调用closesocket()函数将该UDP套接字关闭,释放所占用的系统资源;
        closesocket(msock);
        //步骤7:最后,调用WSACleanup0函数结束Winsock Socket API。
        WSACleanup();
    
        system("pause");
    
        return 0;
    }

    基于TCP的Windows通信

    客户端:

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    #define SERVERIP "127.0.0.1"
    #define SERVER_PORT 23334
    #define BUFSIZ 4096
    int main()
    {
        printf("【客户端:目标IP 127.0.0.1,目标端口:23334】
    
    ");
        //步骤1:使用WSAStartup()函数初始化Winsock DLL;
        int ret;
        WORD socketVersion=MAKEWORD(2, 2);
        WSADATA wsaData;
        ret = WSAStartup(socketVersion, &wsaData);
        if(ret!=0)
        {
            printf("无法打开winsock.dll!
    ");
            exit(-1);
        }
    
        //步骤2:调用socket()函数创建客户端TCP套接字;
        SOCKET tsocket = socket(AF_INET, SOCK_STREAM, 0);
        if(tsocket == INVALID_SOCKET)
        {
            printf("创建socket失败!");
            exit(-1);
        }
    
        //步骤3:找到期望与之通信的远程服务器端套接字的端点地址(即远程服务器端的IP地址和协议端口号),
        //然后再调用connect()函数向远程服务器端发起TCP连接建立请求;
        struct sockaddr_in servaddr;
        ZeroMemory(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr=inet_addr(SERVERIP);
        servaddr.sin_port = htons(SERVER_PORT);
    
        if(connect(tsocket,(struct sockaddr*)&servaddr,sizeof(struct sockaddr))<0)
        {
            printf("连接失败!");
            exit(-1);
        }
    
        //步骤4:在与服务器端成功地建立了TCP连接之后,
        //调用send()函数将缓冲区中的数据从该TCP套接字发送给该远程服务器端;
        char buffer[BUFSIZ];
        printf("输入数据>>");
        scanf("%s",buffer);
    //    char *buffer="这里是客户端~";
        int num=0;
        num = send(tsocket,buffer, strlen(buffer),0);
        if(num!=strlen(buffer))
        {
            printf("发送数据失败!");
            exit(-1);
        }
    
        //步骤5:调用recv()函数从该TCP套接字读取服务器端发送过来的数据并存入缓冲区;
        char buf[BUFSIZ];
        num=0;
        ZeroMemory(buf,sizeof(buf));
        num = recv(tsocket,buf,sizeof(buf),0);
        if(num<0)
        {
            printf("接收数据失败");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
        //步骤6:与服务器端交互完毕,调用closesocket()函数将该 TCP套接字关闭并释放所占用的系统资源;
        closesocket(tsocket);
        //步骤7:最后,调用WSACleanup()函数结束Winsock Socket API。
        WSACleanup();
        system("pause");
    
        return 0;
    }

    客户端2.0:

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    char *SERVERIP="127.0.0.1";
    int SERVER_PORT=23334;
    int my_BUFSIZ=4096;
    void binner()
    {
    
        printf("    _  _  _  _           _           _        _           _ 
    ");
        printf("   (_)(_)(_)(_) _       (_)_       _(_)      (_)_       _(_)
    ");
        printf("   (_)         (_)        (_)_   _(_)          (_)_   _(_)  
    ");
        printf("   (_) _  _  _ (_)          (_)_(_)              (_)_(_)    
    ");
        printf("   (_)(_)(_)(_)              _(_)_                 (_)      
    ");
        printf("   (_)   (_) _             _(_) (_)_               (_)      
    ");
        printf("   (_)      (_) _        _(_)     (_)_             (_)      
    ");
        printf("   (_)         (_)      (_)         (_)            (_)      
    ");
        printf("                                                            
    ");
    }
    int main(int argc,char *argv[])
    {
        binner();
        if(argc>1)
        {
            if(strcmp(argv[1],"-h")==0)
            {
                printf("
    使用说明:
    ");
                printf("-h:帮助 
    ");
                printf("-l:服务器地址,默认127.0.0.1
    ");
                printf("-p:端口,默认23334 
    ");
                printf("-b:发送数据大小,默认4096
    ");
                exit(-1);
            }
            for(int i=1;i<argc;++i)
            {
                if(strcmp(argv[i],"-p")==0)
                {
                    SERVER_PORT=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-b")==0)
                {
                    my_BUFSIZ=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-l")==0)
                {
                    SERVERIP = argv[i+1];
                }
            }
        }
        printf("【客户端:目标IP %s,监听端口 %d,发送数据大小:%d】
    
    ",SERVERIP,SERVER_PORT,my_BUFSIZ);
        //步骤1:使用WSAStartup()函数初始化Winsock DLL;
        int ret;
        WORD socketVersion=MAKEWORD(2, 2);
        WSADATA wsaData;
        ret = WSAStartup(socketVersion, &wsaData);
        if(ret!=0)
        {
            printf("无法打开winsock.dll!
    ");
            exit(-1);
        }
    
        //步骤2:调用socket()函数创建客户端TCP套接字;
        SOCKET tsocket = socket(AF_INET, SOCK_STREAM, 0);
        if(tsocket == INVALID_SOCKET)
        {
            printf("创建socket失败!");
            exit(-1);
        }
    
        //步骤3:找到期望与之通信的远程服务器端套接字的端点地址(即远程服务器端的IP地址和协议端口号),
        //然后再调用connect()函数向远程服务器端发起TCP连接建立请求;
        struct sockaddr_in servaddr;
        ZeroMemory(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr=inet_addr(SERVERIP);
        servaddr.sin_port = htons(SERVER_PORT);
    
        if(connect(tsocket,(struct sockaddr*)&servaddr,sizeof(struct sockaddr))<0)
        {
            printf("连接失败!");
            exit(-1);
        }
    
        //步骤4:在与服务器端成功地建立了TCP连接之后,
        //调用send()函数将缓冲区中的数据从该TCP套接字发送给该远程服务器端;
        char buffer[my_BUFSIZ];
        printf("输入数据>>");
        scanf("%s",buffer);
    //    char *buffer="这里是客户端~";
        int num=0;
        num = send(tsocket,buffer, strlen(buffer),0);
        if(num!=strlen(buffer))
        {
            printf("发送数据失败!");
            exit(-1);
        }
    
        //步骤5:调用recv()函数从该TCP套接字读取服务器端发送过来的数据并存入缓冲区;
        char buf[my_BUFSIZ];
        num=0;
        ZeroMemory(buf,sizeof(buf));
        num = recv(tsocket,buf,sizeof(buf),0);
        if(num<0)
        {
            printf("接收数据失败");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
        //步骤6:与服务器端交互完毕,调用closesocket()函数将该 TCP套接字关闭并释放所占用的系统资源;
        closesocket(tsocket);
        //步骤7:最后,调用WSACleanup()函数结束Winsock Socket API。
        WSACleanup();
        system("pause");
    
        return 0;
    }

    服务器端:

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    #define BUFSIZ 4096
    #define SERVER_PORT 23334
    int main()
    {
        //步骤1:使用WSAStartup()函数初始化Winsock DLL;
        printf("【服务端:监听端口 23334】
    
    ");
        WORD scoketVersion;
        scoketVersion = MAKEWORD(2, 2);
        WSADATA wsaData;
        int ret = WSAStartup(scoketVersion, &wsaData);
        if(ret != 0 )
        {
            printf("无法打开 winsock.dll!
    ");
            exit(-1);
        }
    
        //步骤2:调用socket()函数创建服务器端TCP主套接字;
        SOCKET msock;
        msock = socket(AF_INET, SOCK_STREAM, 0);
        if(msock == INVALID_SOCKET)
        {
            printf("创建socket失败!");
            exit(-1);
        }
    
        //步骤3:调用bind()函数将TCP主套接字绑定到本机的一个可用的端点地址:
        struct sockaddr_in servaddr;
        ZeroMemory(&servaddr,sizeof(servaddr));
    
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVER_PORT);
        ret = bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));
        if(ret < 0)
        {
            printf("绑定服务器端口:%d失败
    ",SERVER_PORT);
            exit(-1);
        }
    
        //步骤4:调用listen()函数将该TCP主套核字设为被动模式,并设置等待队列长度:
        #define QUEUE 20
        if(listen(msock,QUEUE)<0)
        {
            printf("监听失败!");
            exit(-1);
        }
    
        //步骤5:调用accpet()函数从该TCP主套接字上接收一个新的客户 TCP连接请求,
        //并在与该客户之间成功建立了TCP连接之后,为该TCP连接创建一一个新的从套接字
        //(由该新的从套接字来负责与客户之间进行实际的通信);
        SOCKET ssock;
        struct sockaddr_in clientaddr;
        int len = sizeof(clientaddr);
        ZeroMemory(&clientaddr,sizeof(clientaddr));
        ssock=accept(msock,(struct sockaddr*)&clientaddr,&len);
        if(ssock==INVALID_SOCKET)
        {
             printf("接收数据失败
    ");
             exit(-1);
        }
    
        //步骤6:基于新创建的从套接字,调用recv()函数利用 该从套接字读取客户端发送过来的数据并存入缓冲区;
        char buf[BUFSIZ];
        ZeroMemory(buf,sizeof(buf));
        if(recv(ssock, buf, sizeof(buf), 0)<0)
        {
            printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
    
        //步骤7:基于新创建的从套接字,调用send()函数将缓冲区中的数据利用该从套接字发送给该远程客户端;
        //char *buffer="这里是服务器~";
        char buffer[BUFSIZ];
        printf("输入数据>>");
        scanf("%s",buffer);
        if(send(ssock,buffer,strlen(buffer),0)!=strlen(buffer))
        {
            printf("发送数据失败!");
            exit(-1);
        }
    
       //步骤8:与客户交互完毕,调用closesocket()函数将该从套接字关闭,释放所占用的系统资源);
        closesocket(ssock);
    
        //步骤9:最后,当与所有客户交互完毕之后,调用closesocket()函数将TCP主套接字关闭,
        //释放所古用的系统资源,然后,再调用WSACleanup()函数来结束Winsock Socket API
        closesocket(msock);
        WSACleanup();
    
        system("pause");
    
        return 0;
    }

    服务器端2.0:

    #include <stdio.h>
    #include <WinSock2.h>
    #pragma comment(lib, "ws2_32.lib")
    int my_BUFSIZ=4096;
    int  SERVER_PORT=23334;
    void binner()
    {
    
        printf("    _  _  _  _           _           _        _           _ 
    ");
        printf("   (_)(_)(_)(_) _       (_)_       _(_)      (_)_       _(_)
    ");
        printf("   (_)         (_)        (_)_   _(_)          (_)_   _(_)  
    ");
        printf("   (_) _  _  _ (_)          (_)_(_)              (_)_(_)    
    ");
        printf("   (_)(_)(_)(_)              _(_)_                 (_)      
    ");
        printf("   (_)   (_) _             _(_) (_)_               (_)      
    ");
        printf("   (_)      (_) _        _(_)     (_)_             (_)      
    ");
        printf("   (_)         (_)      (_)         (_)            (_)      
    ");
        printf("                                                            
    ");
    }
    int main(int argc,char *argv[])
    {
        binner();
        if(argc>1)
        {
            if(strcmp(argv[1],"-h")==0)
            {
                printf("
    使用说明:
    ");
                printf("-h:帮助 
    ");
                printf("-p:端口,默认23334 
    ");
                printf("-b:发送数据大小,默认4096
    ");
                exit(-1);
            }
            for(int i=1;i<argc;++i)
            {
                if(strcmp(argv[i],"-p")==0)
                {
                    SERVER_PORT=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-b")==0)
                {
                    my_BUFSIZ=atoi(argv[i+1]);
                }
            }
        }
    
         //步骤1:使用WSAStartup()函数初始化Winsock DLL;
        printf("【服务端:监听端口 %d,发送数据大小:%d】
    
    ",SERVER_PORT,my_BUFSIZ);
        WORD scoketVersion;
        scoketVersion = MAKEWORD(2, 2);
        WSADATA wsaData;
        int ret = WSAStartup(scoketVersion, &wsaData);
        if(ret != 0 )
        {
            printf("无法打开 winsock.dll!
    ");
            exit(-1);
        }
    
        //步骤2:调用socket()函数创建服务器端TCP主套接字;
        SOCKET msock;
        msock = socket(AF_INET, SOCK_STREAM, 0);
        if(msock == INVALID_SOCKET)
        {
            printf("创建socket失败!");
            exit(-1);
        }
    
        //步骤3:调用bind()函数将TCP主套接字绑定到本机的一个可用的端点地址:
        struct sockaddr_in servaddr;
        ZeroMemory(&servaddr,sizeof(servaddr));
    
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVER_PORT);
        ret = bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));
        if(ret < 0)
        {
            printf("绑定服务器端口:%d失败
    ",SERVER_PORT);
            exit(-1);
        }
    
        //步骤4:调用listen()函数将该TCP主套核字设为被动模式,并设置等待队列长度:
        #define QUEUE 20
        if(listen(msock,QUEUE)<0)
        {
            printf("监听失败!");
            exit(-1);
        }
    
        //步骤5:调用accpet()函数从该TCP主套接字上接收一个新的客户 TCP连接请求,
        //并在与该客户之间成功建立了TCP连接之后,为该TCP连接创建一一个新的从套接字
        //(由该新的从套接字来负责与客户之间进行实际的通信);
        SOCKET ssock;
        struct sockaddr_in clientaddr;
        int len = sizeof(clientaddr);
        ZeroMemory(&clientaddr,sizeof(clientaddr));
        ssock=accept(msock,(struct sockaddr*)&clientaddr,&len);
        if(ssock==INVALID_SOCKET)
        {
             printf("接收数据失败
    ");
             exit(-1);
        }
    
        //步骤6:基于新创建的从套接字,调用recv()函数利用 该从套接字读取客户端发送过来的数据并存入缓冲区;
        char buf[my_BUFSIZ];
        ZeroMemory(buf,sizeof(buf));
        if(recv(ssock, buf, sizeof(buf), 0)<0)
        {
            printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
    
        //步骤7:基于新创建的从套接字,调用send()函数将缓冲区中的数据利用该从套接字发送给该远程客户端;
        //char *buffer="这里是服务器~";
        char buffer[my_BUFSIZ];
        printf("输入数据>>");
        scanf("%s",buffer);
        if(send(ssock,buffer,strlen(buffer),0)!=strlen(buffer))
        {
            printf("发送数据失败!");
            exit(-1);
        }
    
       //步骤8:与客户交互完毕,调用closesocket()函数将该从套接字关闭,释放所占用的系统资源);
        closesocket(ssock);
    
        //步骤9:最后,当与所有客户交互完毕之后,调用closesocket()函数将TCP主套接字关闭,
        //释放所古用的系统资源,然后,再调用WSACleanup()函数来结束Winsock Socket API
        closesocket(msock);
        WSACleanup();
    
        system("pause");
    
        return 0;
    }

    基于UDP的Linux通信

    客户端:

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
        printf("【客户端:目标IP 127.0.0.1,目标端口:23333】
    
    ");
        //步骤1:调用socket()函数创建客户端UDP套接字;
        int tsock;
        tsock = socket(AF_INET,SOCK_DGRAM,0);
        if(tsock < 0)
        {
            printf("创建套接字失败
    ");
            exit(-1);
        }
        //步骤2:找到期望与之通信的远程服务器的IP地址和协议端口号,然后再调用sendto()函数将缓冲区中的数据从UDP套接字发送给远程服务器端;
        #define SERVERIP "127.0.0.1"
        #define SERVER_PORT 23333
        char buffer[BUFSIZ];
        memset(buffer,'',sizeof(buffer));
        printf("输入数据>>");
        scanf("%s",buffer);
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(struct sockaddr_in));
    
        servaddr.sin_family = AF_INET;
        inet_aton(SERVERIP,&servaddr.sin_addr);
        servaddr.sin_port = htons(SERVER_PORT);
        int len = sizeof(struct sockaddr_in);
    
        if(sendto(tsock,buffer,strlen(buffer),0,(struct sockaddr*)&servaddr,len) != strlen(buffer))
        {
            printf("发送数据失败
    ");
            exit(-1);
        }
    
      
        //步骤3:调用revfrom()函数从该UDP套接字接收来自远程服务器端的数据并存入缓冲区;
        #define BUFSIZE 4096
        char buf[BUFSIZE];
        struct sockaddr_in clientaddr;
        memset(&clientaddr,0,sizeof(struct sockaddr_in));
        memset(buf,'',sizeof(buf));
    
        if(recvfrom(tsock,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&len) < 0)
        {
           printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
    
        close(tsock);
        
        return 0;
    }

    客户端2.0:

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    char *SERVERIP="127.0.0.1";
    int SERVER_PORT=23334;
    int my_BUFSIZ=4096;
    void binner()
    {
    
        printf("    _  _  _  _           _           _        _           _ 
    ");
        printf("   (_)(_)(_)(_) _       (_)_       _(_)      (_)_       _(_)
    ");
        printf("   (_)         (_)        (_)_   _(_)          (_)_   _(_)  
    ");
        printf("   (_) _  _  _ (_)          (_)_(_)              (_)_(_)    
    ");
        printf("   (_)(_)(_)(_)              _(_)_                 (_)      
    ");
        printf("   (_)   (_) _             _(_) (_)_               (_)      
    ");
        printf("   (_)      (_) _        _(_)     (_)_             (_)      
    ");
        printf("   (_)         (_)      (_)         (_)            (_)      
    ");
        printf("                                                            
    ");
    }
    int main(int argc,char *argv[])
    {
        binner();
        if(argc>1)
        {
            if(strcmp(argv[1],"-h")==0)
            {
                printf("
    使用说明:
    ");
                printf("-h:帮助 
    ");
                printf("-l:服务器地址,默认127.0.0.1
    ");
                printf("-p:端口,默认23334 
    ");
                printf("-b:发送数据大小,默认4096
    ");
                exit(-1);
            }
            for(int i=1;i<argc;++i)
            {
                if(strcmp(argv[i],"-p")==0)
                {
                    SERVER_PORT=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-b")==0)
                {
                    my_BUFSIZ=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-l")==0)
                {
                    SERVERIP = argv[i+1];
                }
            }
        }
        printf("【客户端:目标IP %s,监听端口 %d,发送数据大小:%d】
    
    ",SERVERIP,SERVER_PORT,my_BUFSIZ);
        //步骤1:调用socket()函数创建客户端UDP套接字;
        int tsock;
        tsock = socket(AF_INET,SOCK_DGRAM,0);
        if(tsock < 0)
        {
            printf("创建套接字失败
    ");
            exit(-1);
        }
        //步骤2:找到期望与之通信的远程服务器的IP地址和协议端口号,然后再调用sendto()函数将缓冲区中的数据从UDP套接字发送给远程服务器端;
        char buffer[BUFSIZ];
        memset(buffer,'',sizeof(buffer));
        printf("输入数据>>");
        gets(buffer);
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(struct sockaddr_in));
    
        servaddr.sin_family = AF_INET;
        inet_aton(SERVERIP,&servaddr.sin_addr);
        servaddr.sin_port = htons(SERVER_PORT);
        int len = sizeof(struct sockaddr_in);
    
        if(sendto(tsock,buffer,strlen(buffer),0,(struct sockaddr*)&servaddr,len) != strlen(buffer))
        {
            printf("发送数据失败
    ");
            exit(-1);
        }
    
    
        //步骤3:调用revfrom()函数从该UDP套接字接收来自远程服务器端的数据并存入缓冲区;
        char buf[my_BUFSIZ];
        struct sockaddr_in clientaddr;
        memset(&clientaddr,0,sizeof(struct sockaddr_in));
        memset(buf,'',sizeof(buf));
    
        if(recvfrom(tsock,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&len) < 0)
        {
           printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
    
        close(tsock);
    
        return 0;
    }

    服务器端:

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <stdlib.h>
    
    int main()
    {
        printf("【UDP服务端:监听端口 23333】
    
    ");
        //步骤1: 调用socket()函数创建服务器端UDP套接字;
        int msocket;
        msocket = socket(AF_INET,SOCK_DGRAM,0);
        if(msocket<0)
        {
            printf("创建套接字失败");
            exit(-1);
        }
        
        //步骤2:调用bind()函数将该UDP套接字绑定到本机的一个可用的端点地址;
        #define SERVER_PORT 23333
        int ret;
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(struct sockaddr_in));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVER_PORT);
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        ret=bind(msocket,(struct sockaddr*)&servaddr,sizeof(struct sockaddr_in));
        if(ret<0)
        {
            printf("服务器绑定端口:%d失败",SERVER_PORT);
            exit(-1);
    
        }
        //步骤3:调用recvfrom函数从该UDP套接字接收来自远程客户端的数据并存入缓冲区,同时获得远程客户端的套接字端点地址并保存;
        #define BUFSIZE 4096
        char buf[BUFSIZE];
        memset(buf,'',sizeof(buf));
        struct sockaddr_in clientaddr;
        int len = sizeof(clientaddr);
        memset(&clientaddr,0,sizeof(struct sockaddr_in));
            
        if(recvfrom(msocket, buf, sizeof(buf), 0, (struct sockaddr*)&clientaddr, &len)<0)
        {
            printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
        //步骤4:基于保存的远程客户端的套接字端点地址,调用sendto函数将缓冲区中的数据从该UDP套接字发送给该远程客户端;
        memset(buf,'',sizeof(buf));
        printf("输入数据>>");
        scanf("%s",buf);
        if(sendto(msocket,buf,strlen(buf),0,(struct sockaddr*)&clientaddr,len)!=strlen(buf))
        {
            printf("发送数据失败!");
            exit(-1);
        }
        //步骤5:与客户交互完毕,调用close()函数将该 UDP套接字关闭,释放所占用的系统资源。
        close(msocket);  
        return 0;
     }

    服务器端2.0:

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <stdlib.h>
    int  my_BUFSIZ=4096;
    int  SERVER_PORT=23334;
    void binner()
    {
    
        printf("    _  _  _  _           _           _        _           _ 
    ");
        printf("   (_)(_)(_)(_) _       (_)_       _(_)      (_)_       _(_)
    ");
        printf("   (_)         (_)        (_)_   _(_)          (_)_   _(_)  
    ");
        printf("   (_) _  _  _ (_)          (_)_(_)              (_)_(_)    
    ");
        printf("   (_)(_)(_)(_)              _(_)_                 (_)      
    ");
        printf("   (_)   (_) _             _(_) (_)_               (_)      
    ");
        printf("   (_)      (_) _        _(_)     (_)_             (_)      
    ");
        printf("   (_)         (_)      (_)         (_)            (_)      
    ");
        printf("                                                            
    ");
    }
    int main(int argc,char *argv[])
    {
        binner();
        if(argc>1)
        {
            if(strcmp(argv[1],"-h")==0)
            {
                printf("
    使用说明:
    ");
                printf("-h:帮助 
    ");
                printf("-p:端口,默认23334 
    ");
                printf("-b:发送数据大小,默认4096
    ");
                exit(-1);
            }
            for(int i=1;i<argc;++i)
            {
                if(strcmp(argv[i],"-p")==0)
                {
                    SERVER_PORT=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-b")==0)
                {
                    my_BUFSIZ=atoi(argv[i+1]);
                }
            }
        }
        printf("【UDP服务端:监听端口 %d,发送数据大小:%d】
    
    ",SERVER_PORT,my_BUFSIZ);
        //步骤1: 调用socket()函数创建服务器端UDP套接字;
        int msocket;
        msocket = socket(AF_INET,SOCK_DGRAM,0);
        if(msocket<0)
        {
            printf("创建套接字失败");
            exit(-1);
        }
    
        //步骤2:调用bind()函数将该UDP套接字绑定到本机的一个可用的端点地址;
    
        int ret;
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(struct sockaddr_in));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVER_PORT);
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        ret=bind(msocket,(struct sockaddr*)&servaddr,sizeof(struct sockaddr_in));
        if(ret<0)
        {
            printf("服务器绑定端口:%d失败",SERVER_PORT);
            exit(-1);
    
        }
        //步骤3:调用recvfrom函数从该UDP套接字接收来自远程客户端的数据并存入缓冲区,同时获得远程客户端的套接字端点地址并保存;
    
        char buf[my_BUFSIZ];
        memset(buf,'',sizeof(buf));
        struct sockaddr_in clientaddr;
        int len = sizeof(clientaddr);
        memset(&clientaddr,0,sizeof(struct sockaddr_in));
    
        if(recvfrom(msocket, buf, sizeof(buf), 0, (struct sockaddr*)&clientaddr, &len)<0)
        {
            printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
        //步骤4:基于保存的远程客户端的套接字端点地址,调用sendto函数将缓冲区中的数据从该UDP套接字发送给该远程客户端;
        memset(buf,'',sizeof(buf));
        printf("输入数据>>");
        gets(buf);
        if(sendto(msocket,buf,strlen(buf),0,(struct sockaddr*)&clientaddr,len)!=strlen(buf))
        {
            printf("发送数据失败!");
            exit(-1);
        }
        //步骤5:与客户交互完毕,调用close()函数将该 UDP套接字关闭,释放所占用的系统资源。
        close(msocket);
        return 0;
     }

    基于TCP的Linux通信

    客户端:

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define BUFSIZE 4096
    int SERVER_PORT= 23335;
    int main()
    {
        //步骤1:调用socket函数创建客户端TCP套接字;
        printf("输入通信端口:");
        scanf("%d",&SERVER_PORT);
        printf("
    	【客户端:目标IP 127.0.0.1,目标端口:%d】
    
    ",SERVER_PORT);
        int tsock;
        tsock = socket(AF_INET,SOCK_STREAM,0);
        if(tsock < 0)
        {
            printf("创建socket失败!
    ");
            exit(-1);
        }
        //步骤2:找到期望与之通信的远程服务器端套接字的端点地址(即服务器端的IP地址和协议端口号);然后,调用connect函数向远程服务器端发起TCP连接建立请求;
        #define SERVERIP "127.0.0.1"
        
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(struct sockaddr_in));
    
        servaddr.sin_family = AF_INET;
        inet_aton(SERVERIP,&servaddr.sin_addr);
        servaddr.sin_port = htons(SERVER_PORT);
    
        int ret;
        ret = connect(tsock,(struct sockaddr*)&servaddr,sizeof(struct sockaddr));
        if(ret < 0)
        {
            printf("连接失败!
    ");
            exit(-1);
        }
        
        //步骤3:在与服务器端成功地建立了TCP连接之后,调用send()函数将缓冲区中的数据从套接字发送给该远程服务器端;
        char buffer[BUFSIZ];
        memset(buffer,'',sizeof(buffer));
        printf("输入数据>>");
        scanf("%s",buffer);
        int num = 0;
        num = send(tsock,buffer,strlen(buffer),0);
        if(num != strlen(buffer))
        {
            printf("发送数据失败!
    ");
            exit(-1);
        }
        //步骤4:调用recv()函数从套接字读取服务器端发送过来的数据并存入缓冲区;
        char buf[BUFSIZE];
        memset(buf,'',sizeof(buf));
        num = 0;
        num = recv(tsock,buf,sizeof(buf),0);
        if(num < 0)
        {
            printf("接收数据失败!
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
        //步骤5:与服务器端交互完毕,调用close()函数将套接字关闭,释放所占用的系统资源。
        close(tsock);
    }

    客户端2.0:

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    char *SERVERIP="127.0.0.1";
    int SERVER_PORT=23334;
    int my_BUFSIZ=4096;
    void binner()
    {
    
        printf("    _  _  _  _           _           _        _           _ 
    ");
        printf("   (_)(_)(_)(_) _       (_)_       _(_)      (_)_       _(_)
    ");
        printf("   (_)         (_)        (_)_   _(_)          (_)_   _(_)  
    ");
        printf("   (_) _  _  _ (_)          (_)_(_)              (_)_(_)    
    ");
        printf("   (_)(_)(_)(_)              _(_)_                 (_)      
    ");
        printf("   (_)   (_) _             _(_) (_)_               (_)      
    ");
        printf("   (_)      (_) _        _(_)     (_)_             (_)      
    ");
        printf("   (_)         (_)      (_)         (_)            (_)      
    ");
        printf("                                                            
    ");
    }
    int main(int argc,char *argv[])
    {
        binner();
        if(argc>1)
        {
            if(strcmp(argv[1],"-h")==0)
            {
                printf("
    使用说明:
    ");
                printf("-h:帮助 
    ");
                printf("-l:服务器地址,默认127.0.0.1
    ");
                printf("-p:端口,默认23334 
    ");
                printf("-b:发送数据大小,默认4096
    ");
                exit(-1);
            }
            for(int i=1;i<argc;++i)
            {
                if(strcmp(argv[i],"-p")==0)
                {
                    SERVER_PORT=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-b")==0)
                {
                    my_BUFSIZ=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-l")==0)
                {
                    SERVERIP = argv[i+1];
                }
            }
        }
        //步骤1:调用socket函数创建客户端TCP套接字;
        printf("【客户端:目标IP %s,监听端口 %d,发送数据大小:%d】
    
    ",SERVERIP,SERVER_PORT,my_BUFSIZ);
        int tsock;
        tsock = socket(AF_INET,SOCK_STREAM,0);
        if(tsock < 0)
        {
            printf("创建socket失败!
    ");
            exit(-1);
        }
        //步骤2:找到期望与之通信的远程服务器端套接字的端点地址(即服务器端的IP地址和协议端口号);然后,调用connect函数向远程服务器端发起TCP连接建立请求;
    
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(struct sockaddr_in));
    
        servaddr.sin_family = AF_INET;
        inet_aton(SERVERIP,&servaddr.sin_addr);
        servaddr.sin_port = htons(SERVER_PORT);
    
        int ret;
        ret = connect(tsock,(struct sockaddr*)&servaddr,sizeof(struct sockaddr));
        if(ret < 0)
        {
            printf("连接失败!
    ");
            exit(-1);
        }
    
        //步骤3:在与服务器端成功地建立了TCP连接之后,调用send()函数将缓冲区中的数据从套接字发送给该远程服务器端;
        char buffer[BUFSIZ];
        memset(buffer,'',sizeof(buffer));
        printf("输入数据>>");
        gets(buffer);
        int num = 0;
        num = send(tsock,buffer,strlen(buffer),0);
        if(num != strlen(buffer))
        {
            printf("发送数据失败!
    ");
            exit(-1);
        }
        //步骤4:调用recv()函数从套接字读取服务器端发送过来的数据并存入缓冲区;
        char buf[my_BUFSIZ];
        memset(buf,'',sizeof(buf));
        num = 0;
        num = recv(tsock,buf,sizeof(buf),0);
        if(num < 0)
        {
            printf("接收数据失败!
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
        //步骤5:与服务器端交互完毕,调用close()函数将套接字关闭,释放所占用的系统资源。
        close(tsock);
    }

    服务器端:

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    int SERVER_PORT = 23335 ;
    int main()
    {
        printf("输入通信端口:");
        scanf("%d",&SERVER_PORT);
        printf("
    	【TCP服务端:监听端口 %d】
    
    ",SERVER_PORT);
        //步骤1:调用socket()函数创建服务器端TCP主套接字;
        int msock;
        msock = socket(AF_INET,SOCK_STREAM,0);
        if(msock<0)
        {
            printf("创建套接字失败");
            exit(-1);
        }
        //步骤2:调用bind()函数将该TCP套接字绑定到本机的一个可用的端点地址;
        
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(struct sockaddr_in));
    
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVER_PORT);
        int ret = bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));
        if(ret < 0)
        {
            printf("绑定服务器端口:%d失败
    ",SERVER_PORT);
            exit(-1);
        }
        
        //步骤3:调用lsten函数将该TCP套接字设为被动模式,并设置等待队列的长度;
        #define QUEUE 20
        if(listen(msock,QUEUE)<0)
        {
            printf("监听失败!
    ");
            exit(-1);
        }
    
        //步骤4:调用accept()函数从该TCP套接字上接收一个新客户连接请求,并且在与该客户之间成功建立了TCP 连接之后,为该TCP连接创建个新的从套接字 (由该新套接字来负责与客户之间进行实际的通信);
        int ssock;
        struct sockaddr_in clientaddr;
        int len = sizeof(clientaddr);
        memset(&clientaddr,0,sizeof(struct sockaddr_in));
        ssock=accept(msock,(struct sockaddr*)&clientaddr,&len);
        if(ssock<0)
        {
             printf("接收数据失败
    ");
             exit(-1);
        }
        //步骤5:基于新创建的从套接字,调用recv(函数从套接字读取客户发送过来的数据并存入缓冲区;
        #define BUFSIZ 4096
        char buf[BUFSIZ];
        memset(buf,'',sizeof(buf));
        if(recv(ssock, buf, sizeof(buf), 0)<0)
        {
            printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
    
        //步骤6:基于新创建的从套接字,调用send()函 数将缓冲区中的数据从套接字发送给该远程客户:
        
        char buffer[BUFSIZ];
        printf("输入数据>>");
        scanf("%s",buffer);
        if(send(ssock,buffer,strlen(buffer),0)!=strlen(buffer))
        {
            printf("发送数据失败!");
            exit(-1);
        }
    
       //步骤7:与客户交互完毕,调用close()函数将从套接字关闭,释放所占用的系统资源;
        close(ssock);
       //步骤8:与所有客户交互完毕,调用close()函数将主套接字关闭,释放所占用的系统资源
        close(msock);
        return 0;
    }

    服务器端2.0:

    #include <stdio.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    int SERVER_PORT = 23335 ;
    int my_BUFSIZ=4096;
    void binner()
    {
    
        printf("    _  _  _  _           _           _        _           _ 
    ");
        printf("   (_)(_)(_)(_) _       (_)_       _(_)      (_)_       _(_)
    ");
        printf("   (_)         (_)        (_)_   _(_)          (_)_   _(_)  
    ");
        printf("   (_) _  _  _ (_)          (_)_(_)              (_)_(_)    
    ");
        printf("   (_)(_)(_)(_)              _(_)_                 (_)      
    ");
        printf("   (_)   (_) _             _(_) (_)_               (_)      
    ");
        printf("   (_)      (_) _        _(_)     (_)_             (_)      
    ");
        printf("   (_)         (_)      (_)         (_)            (_)      
    ");
        printf("                                                            
    ");
    }
    int main(int argc,char *argv[])
    {
        binner();
        if(argc>1)
        {
            if(strcmp(argv[1],"-h")==0)
            {
                printf("
    使用说明:
    ");
                printf("-h:帮助 
    ");
                printf("-p:端口,默认23334 
    ");
                printf("-b:发送数据大小,默认4096
    ");
                exit(-1);
            }
            for(int i=1;i<argc;++i)
            {
                if(strcmp(argv[i],"-p")==0)
                {
                    SERVER_PORT=atoi(argv[i+1]);
                }
                else if(strcmp(argv[i],"-b")==0)
                {
                    my_BUFSIZ=atoi(argv[i+1]);
                }
            }
        }
        printf("【TCP服务端:监听端口 %d,发送数据大小:%d】
    
    ",SERVER_PORT,my_BUFSIZ);
        //步骤1:调用socket()函数创建服务器端TCP主套接字;
        int msock;
        msock = socket(AF_INET,SOCK_STREAM,0);
        if(msock<0)
        {
            printf("创建套接字失败");
            exit(-1);
        }
        //步骤2:调用bind()函数将该TCP套接字绑定到本机的一个可用的端点地址;
    
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(struct sockaddr_in));
    
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVER_PORT);
        int ret = bind(msock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));
        if(ret < 0)
        {
            printf("绑定服务器端口:%d失败
    ",SERVER_PORT);
            exit(-1);
        }
    
        //步骤3:调用lsten函数将该TCP套接字设为被动模式,并设置等待队列的长度;
        #define QUEUE 20
        if(listen(msock,QUEUE)<0)
        {
            printf("监听失败!
    ");
            exit(-1);
        }
    
        //步骤4:调用accept()函数从该TCP套接字上接收一个新客户连接请求,并且在与该客户之间成功建立了TCP 连接之后,为该TCP连接创建个新的从套接字 (由该新套接字来负责与客户之间进行实际的通信);
        int ssock;
        struct sockaddr_in clientaddr;
        int len = sizeof(clientaddr);
        memset(&clientaddr,0,sizeof(struct sockaddr_in));
        ssock=accept(msock,(struct sockaddr*)&clientaddr,&len);
        if(ssock<0)
        {
             printf("接收数据失败
    ");
             exit(-1);
        }
        //步骤5:基于新创建的从套接字,调用recv(函数从套接字读取客户发送过来的数据并存入缓冲区;
    
        char buf[my_BUFSIZ];
        memset(buf,'',sizeof(buf));
        if(recv(ssock, buf, sizeof(buf), 0)<0)
        {
            printf("接收数据失败
    ");
            exit(-1);
        }
        else
        {
            printf("已接受数据>>%s
    ",buf);
        }
    
        //步骤6:基于新创建的从套接字,调用send()函 数将缓冲区中的数据从套接字发送给该远程客户:
    
        char buffer[my_BUFSIZ];
        printf("输入数据>>");
        gets(buffer);
        if(send(ssock,buffer,strlen(buffer),0)!=strlen(buffer))
        {
            printf("发送数据失败!");
            exit(-1);
        }
    
       //步骤7:与客户交互完毕,调用close()函数将从套接字关闭,释放所占用的系统资源;
        close(ssock);
       //步骤8:与所有客户交互完毕,调用close()函数将主套接字关闭,释放所占用的系统资源
        close(msock);
        return 0;
    }
  • 相关阅读:
    线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新
    树&二叉树&&满二叉树&&完全二叉树&&完满二叉树
    Git学习记录 力做全网最强入门教程
    Markdown测试
    [转载] c++对结构体数组排序
    c/c++ 中#ifndef和#endif的作用及使用
    交互题(apio2016Gap)
    linux下对拍
    CTSC2017密钥、吉夫特
    省队十连测
  • 原文地址:https://www.cnblogs.com/chrysanthemum/p/13772119.html
Copyright © 2020-2023  润新知