ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[C++] C++socket套接字网络通讯实例

2020-02-20 11:57:27  阅读:243  来源: 互联网

标签:return socket retVal C++ 接字 SIZE BUF cout


//服务器端:
#include "winsock2.h"  
#include <string>
#pragma comment(lib, "ws2_32.lib")  //附加依赖lib库 也可以在属性中设置
#include<iostream>
using namespace std;

//数据库相关

int main()
{
        
        WSADATA         wsd;            //WSADATA变量  
        SOCKET          sServer;        //服务器套接字  用来监听
        SOCKET          sClient;        //客户端套接字  连接
        SOCKADDR_IN     addrServ;;      //服务器地址  
        const int BUF_SIZE = 500;
        char            buf[BUF_SIZE];  //接收数据缓冲区  
        char            sendBuf[BUF_SIZE];//返回给客户端得数据  
        int             retVal;         //返回值  
        //初始化套结字动态库  代码健壮
        if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
        {
                cout << "WSAStartup failed!" << endl;
                return 1;
        }

        //开始创建服务端socket
        //创建套接字  AF_INET:ipv4   SOCK_STREAM:使用tcp
        sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (INVALID_SOCKET == sServer)
        {
                cout << "socket failed!" << endl;
                WSACleanup();//释放套接字资源;  
                return  -1;
        }

        //服务器套接字地址   
        addrServ.sin_family = AF_INET;//IPv4 
        addrServ.sin_port = htons(4999);//设置端口 建议大于1024
        addrServ.sin_addr.s_addr = INADDR_ANY; //表示接受任何客户端的请求

        //绑定套接字  绑定服务端socket 和 端口
        retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
        if (SOCKET_ERROR == retVal)
        {
                cout << "bind failed!" << endl;
                closesocket(sServer);   //关闭套接字  
                WSACleanup();           //释放套接字资源;  
                return -1;
        }

        //开始监听   
        retVal = listen(sServer, 10);
        if (SOCKET_ERROR == retVal)
        {
                cout << "listen failed!" << endl;
                closesocket(sServer);   //关闭套接字  
                WSACleanup();           //释放套接字资源;  
                return -1;
        }

        //接受客户端请求  
        sockaddr_in addrClient;
        int addrClientlen = sizeof(addrClient);
        sClient = accept(sServer, (sockaddr FAR*)&addrClient, &addrClientlen);//使用sClient进行数据收发
        if (INVALID_SOCKET == sClient)
        {
                cout << "accept failed!" << endl;
                closesocket(sServer);   //关闭套接字  
                WSACleanup();           //释放套接字资源;  
                return -1;
        }

        while (1)
        {
                //接收客户端数据  
                ZeroMemory(buf, BUF_SIZE);//初始化 buf  用 0填充
                ZeroMemory(sendBuf, BUF_SIZE);
                retVal = recv(sClient, buf, BUF_SIZE, 0);
                if (SOCKET_ERROR == retVal)
                {
                        cout << "recv failed!" << endl;
                        closesocket(sServer);   //关闭套接字  
                        closesocket(sClient);   //关闭套接字       
                        WSACleanup();           //释放套接字资源;  
                        return -1;
                }

                cout << "set:" << buf << endl;
                //向客户端发送数据
                cout << "go:";
                cin >> sendBuf;
                send(sClient, sendBuf, strlen(sendBuf), 0);
        }
        

        //关闭连接 释放资源
        closesocket(sServer);   //关闭套接字  
        closesocket(sClient);   //关闭套接字  
        WSACleanup();           //释放套接字资源;  

        system("pause");
        return 0;
}

//客户端:
#include "winsock2.h"  
#include <string>
#include <iostream>  
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()
{
        WSADATA wsd; //WSADATA变量  
        SOCKET sHost; //客户端套接字  
        SOCKADDR_IN servAddr; //服务器地址  

        const int BUF_SIZE = 500;
        char buf[BUF_SIZE]; //接收数据缓冲区  
        char bufRecv[BUF_SIZE];
        int retVal; //返回值  
        //初始化套结字动态库 
        if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
        {
                cout << "WSAStartup failed!" << endl;
                return -1;
        }
        //创建套接字  
        sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (INVALID_SOCKET == sHost)
        {
                cout << "socket failed!" << endl;
                WSACleanup();//释放套接字资源  
                return  -1;
        }
        servAddr.sin_family = AF_INET;
        //如果编译通不过 属性 c++ 常规  sdl 改成否
        char inte[20];
        scanf("%s",inte);
        servAddr.sin_addr.s_addr = inet_addr(inte);//设置服务端地址  这里表示本机
        servAddr.sin_port = htons((short)4999);
        int nServAddlen = sizeof(servAddr);

        //连接服务器  
        retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));
        if (SOCKET_ERROR == retVal)
        {
                cout << "connect failed!" << endl;
                closesocket(sHost); //关闭套接字  
                WSACleanup(); //释放套接字资源  
                return -1;
        }
        //成功建立连接  可以开始通信了
        while (1)
        {
                //向服务器发送数据  
                ZeroMemory(buf, BUF_SIZE);
                cout << "go:";
                cin >> buf;
                // 包装数据:   指令标记 :  内容
                //                                                1-100 
                //                                                1:登录  username - passeord 2:注册  3 查询  4 更新数据库 5 .....
                /*
                        struct info
                        {
                                int                flag; 指令
                                char*  username;
                                char* password;
                                其他结构体
                        }
                        
                */
                retVal = send(sHost, buf, strlen(buf), 0);
                if (SOCKET_ERROR == retVal)
                {
                        cout << "send failed!" << endl;
                        closesocket(sHost); //关闭套接字  
                        WSACleanup(); //释放套接字资源  
                        return -1;
                }
                ZeroMemory(bufRecv, BUF_SIZE);
                recv(sHost, bufRecv, BUF_SIZE, 0); // 接收服务器端的数据
                cout << endl << "set:" << bufRecv;
                cout << "\n";
        }
        

        closesocket(sHost); //关闭套接字  
        WSACleanup(); //释放套接字资源  
        system("pause");
        return 0;
}

用dev-c++编译socket代码时需要更改 工具-编译器选项 的第二栏为-lwsock32

标签:return,socket,retVal,C++,接字,SIZE,BUF,cout
来源: https://www.cnblogs.com/56843268qqq/p/12335002.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有