• WinSock2.0通信的一个例子(基于VC++6.0开发测试)


    实验目的:

    掌握Winsock2.0套接字编程技术的基本方法。

    实验要求:

    运用TCP/IP Winsock2.0套接字编程技术,使用VC编写一个面向连接通信的服务端程序与客户端程序,服务器先与端口3000绑定,

    然后等待客户连接,连接成功后就可与客户端互相收、发信息。交互中,通信任一方只要发送 bye, 通信过程便自动结束。

    服务端:

    #include <conio.h>
    #include <stdio.h>
    #include <winsock2.h>
    
    #pragma comment(lib, "Ws2_32.lib")
    
    int main(int, char **)
    {
        struct sockaddr addr;
        int recvLen, errCode;
        
        char msg[255] = {0};
        SOCKET sock, sersock;
    
        WORD wVersionRequested;
        WSADATA wsaData;
        LPSTR messageBuffer = NULL;
    
        SetConsoleTitle("服务端");
    
        wVersionRequested = MAKEWORD(2, 0);
        errCode = WSAStartup(wVersionRequested, &wsaData);
    
        if (errCode)
        { 
            printf("没有Windows Socket动态库!
    ");
            return WSAGetLastError();
        }
    
        if (LOBYTE(wsaData.wVersion) != 2 || //不是Winsock 2.0
            HIBYTE(wsaData.wVersion) != 0)
        {
            printf("需要Windows Socket 2!
    ");
            WSACleanup();
            return WSAGetLastError();
        }
    
        sock = socket(AF_INET, SOCK_STREAM, 0);
    
    
        if (sock == INVALID_SOCKET)
        { 
            printf("不能创建Socket!
    ");
            getch();
            WSACleanup(); 
            return 0;
        }
    
        ((sockaddr_in *)&addr)->sin_family = AF_INET;
        
        ((sockaddr_in *)&addr)->sin_port = htons(3000);
    
        ((sockaddr_in *)&addr)->sin_addr.s_addr = inet_addr("127.0.0.1");
    
        bind(sock, &addr, sizeof(addr));
    
    
        listen(sock, 1);
    
    
        printf("等待客户连接!
    ");
        recvLen = sizeof(addr);
        sersock = accept(sock, &addr, &recvLen);
    
        if (sersock == INVALID_SOCKET)
        {
            errCode = WSAGetLastError();
    
            size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER 
                | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPSTR)&messageBuffer, 0, NULL);
    
            printf("%s
    ", messageBuffer);
            free(messageBuffer);
            
            getch();
            closesocket(sock);
            WSACleanup();
            return 0;
        }
    
        printf("有客户连接!
    输入bye通信结束
    ");
    
    
        do
        {
            printf("
    等待客户端输入信息......");
            recvLen = recv(sersock, msg, 200, 0);
            printf("
    客户端:%s", msg);
        
            if (!strcmp(msg, "bye"))
                break;
            printf("
    服务器:");
            gets(msg);
            
        
            send(sersock, msg, strlen(msg) + 1, 0);
    
        } while (strcmp(msg, "bye"));
    
        closesocket(sersock);
        closesocket(sock);
        printf("
    
    会话结束,按任一键返回
    ");
        getch();
        WSACleanup();
        return 0;
    }

    客户端:

    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock2.h>
    
    #pragma comment(lib, "Ws2_32.lib")
    
    int main(int, char **)
    {
        SOCKET sock;
        struct sockaddr addr;
        int errCode;
        char msg[255] = {0};
    
        WORD wVersionRequested;
        WSADATA wsaData;
    
        SetConsoleTitle("客户端");
        wVersionRequested = MAKEWORD(2, 0);
        errCode = WSAStartup(wVersionRequested, &wsaData);
    
        if (errCode)
        { 
            printf("没有Windows Socket动态库!
    ");
            return WSAGetLastError();
        }
    
        if (LOBYTE(wsaData.wVersion) != 2 || 
            HIBYTE(wsaData.wVersion) != 0)
        {
            printf("需要Windows Socket 2!
    ");
            WSACleanup(); 
            return WSAGetLastError();
        }
    
        sock = socket(AF_INET, SOCK_STREAM, 0);
    
    
        if (sock == INVALID_SOCKET)
        { 
            printf("不能创建Socket!
    ");
            getch();
            WSACleanup(); 
            return WSAGetLastError();
        }
    
        ((sockaddr_in *)&addr)->sin_family = AF_INET;
    
        ((sockaddr_in *)&addr)->sin_addr.s_addr = inet_addr("127.0.0.1");
    
        ((sockaddr_in *)&addr)->sin_port = htons(3000);
    
        printf("与服务器连接...!
    ");
        
        errCode = connect(sock, (sockaddr *)&addr, sizeof(addr));
        if (errCode == SOCKET_ERROR)
        { 
            printf("连接失败!
    ");
            getch();
            WSACleanup();
            return 0;
        }
    
        printf("成功连接到服务器127.0.0.1!
    若输入bye则通信结束
    ");
    
    
        do
        {
            printf("
    
    客户端:");
            gets(msg);
        
            send(sock, msg, strlen(msg) + 1, 0);
    
            if (!strcmp(msg, "bye")) break;
    
            printf("等待服务器响应......
    ");
    
            recv(sock, msg, 200, 0);
    
            printf("服务器:%s", msg);
    
        } while (strcmp(msg, "bye"));
    
        closesocket(sock);
        printf("
    会话结束,按任一键返回
    ");
        getch();
        WSACleanup();
        return 0;
    }

    运行效果:

    此为学校实验题目:word排版请用http://www.planetb.ca/syntax-highlight-word

    Winsock2.0相关参考网站,拥有大量示例代码:https://www.tenouk.com/

  • 相关阅读:
    微信二维码 场景二维码 用于推送事件,关注等 注册用户 ,经过测试
    简单的 Helper 封装 -- CookieHelper
    简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
    Java反射机制
    Windows Azure Web Site (13) Azure Web Site备份
    Windows Azure Virtual Machine (1) IaaS用户手册
    Windows Azure Web Site (1) 用户手册
    Windows Azure Web Site (12) Azure Web Site配置文件
    Windows Azure Web Site (11) 使用源代码管理器管理Azure Web Site
    Windows Azure Web Site (10) Web Site测试环境
  • 原文地址:https://www.cnblogs.com/passedbylove/p/12016114.html
Copyright © 2020-2023  润新知