C++Socket通訊(用戶端和伺服器)

來源:互聯網
上載者:User

標籤:初始化   accept   資訊   ioctl   strlen   astar   大連   substr   split   

win32控制台版

擷取本機IP:

cmd:       ipconfig/all

我寫的是一個伺服器和用戶端點對點的資訊傳遞(實現相互的可以適當更改代碼):

伺服器發送給用戶端的是一個結構體資料

typedef struct Date {    float m1;    float m2;    float m3;    float m_roll;    float m_pitch;    float m_rotate;}Datablock;

上伺服器代碼(阻塞式的):

#include "stdafx.h"#include <iostream>   #include <string>   #include <winsock2.h>   #pragma comment(lib,"ws2_32.lib")   using std::cout;using std::cin;using std::string;using std::endl;typedef struct Date {    float m1;    float m2;    float m3;    float m_roll;    float m_pitch;    float m_rotate;}Datablock;int main(){        cout << "伺服器啟動!....." << endl;    //初始化winsock       WSADATA wsaD;    WSAStartup(MAKEWORD(1, 1), &wsaD);    //建立監聽通訊端       SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    // 綁定主機地址和監聽通訊端       struct sockaddr_in my_addr;   //主機地址       my_addr.sin_family = AF_INET;    my_addr.sin_port = htons(8088); //指定連接埠       my_addr.sin_addr.s_addr = htonl(INADDR_ANY);    bind(slisten, (struct sockaddr *)&my_addr, sizeof(my_addr));    //啟動監聽       listen(slisten, 5);    //5是最大串連數                           //開始接收資料       struct sockaddr_in c_addr;  //客戶地址       int addr_len = sizeof(c_addr);    SOCKET sconnect = accept(slisten, (struct sockaddr*)&c_addr, &addr_len); //通過監聽通訊端建立串連通訊端           cout << "串連已建立......" << endl;    char buf[500];    while (true) {        Datablock client_send;        cout << "輸入(start)開始更改,輸入(end)結束服務:" << endl;        cout << "輸入發送內容:";        while (cin.getline(buf, 500))        {            string rcover = buf;            if (rcover == "end")break;            if (rcover == "start") {                cout << "請以m1-m2-m3-m_roll-m_pitch-m_rotate格式輸入資料:" << endl;                char transmit[100];                cin.getline(transmit, 100);                send(sconnect, transmit, strlen(transmit) + 1, 0);  //字串還有個結束標誌                memset(transmit, 0, sizeof(transmit));                                    }                    }        return 0;    }

用戶端:(非阻塞式的)

首先要有宏(一般放在.h檔案的標頭檔地區)

#include "stdafx.h"#include <iostream>   #include <string>  #include<cstring>#include <winsock2.h>  #include <WS2tcpip.h> #include<vector>#include<sstream>#pragma comment(lib,"ws2_32.lib")   using namespace std;typedef struct Date {    float m1;    float m2;    float m3;    float m_roll;    float m_pitch;    float m_rotate;}Datablock;void splitEx(vector<string>&strs, const string& src, string separate_character){    int separate_characterLen = separate_character.size();//分割字串的長度,這樣就可以支援如“,,”多字串的分隔字元    int lastPosition = 0, index = -1;    while (-1 != (index = src.find(separate_character, lastPosition)))    {        strs.push_back(src.substr(lastPosition, index - lastPosition));        lastPosition = index + separate_characterLen;    }    string lastString = src.substr(lastPosition);//截取最後一個分隔字元後的內容    if (!lastString.empty())        strs.push_back(lastString);//如果最後一個分隔字元後還有內容就入隊}float str_float(string a) {    float b;    stringstream ss;                              //string 轉 int    ss << a;    ss >> b;    return b;}int main(){    cout << "用戶端啟動" << endl;    //初始化winsock       WSADATA wsaD;    WSAStartup(MAKEWORD(1, 1), &wsaD);    //建立用戶端socket       SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    //串連伺服器       u_long iMode = 1;//如果設定為0,為阻塞式的    ioctlsocket(sclient, FIONBIO, &iMode);    struct sockaddr_in servaddr;    servaddr.sin_family = AF_INET;    cout << "請輸入區域網路IP地址:" << endl;    string ipaddress;    cin >> ipaddress;    cout << ipaddress;    servaddr.sin_addr.s_addr = inet_addr(ipaddress.c_str()); //指定伺服器       servaddr.sin_port = htons(8088);             //指定連接埠       cout << endl<<"OK" << endl;        connect(sclient, (struct sockaddr*)&servaddr, sizeof(servaddr)); //通過通訊端串連主機               char buf[500];                Datablock resu_data;        while (true) {            //儲存接收的字元               int len = recv(sclient, buf, sizeof(buf), 0);  //通過串連通訊端接收資料                        if (len > 0)            {                vector<string>result;                cout << "客戶說:" << buf << endl;                    string test = buf;                cout << test << endl;                splitEx(result, test, "-");                        resu_data.m1 = str_float(result[0]);                resu_data.m2 = str_float(result[1]);                resu_data.m3 = str_float(result[2]);                resu_data.m_roll = str_float(result[3]);                resu_data.m_pitch = str_float(result[4]);                resu_data.m_rotate = str_float(result[5]);                cout << resu_data.m1 << endl;                cout << resu_data.m2 << endl;                cout << resu_data.m3 << endl;                cout << resu_data.m_roll << endl;                cout << resu_data.m_pitch<< endl;                cout << resu_data.m_rotate << endl;                    }                }                return 0;}

這是一個點對點的,先開server,後開用戶端。

C++Socket通訊(用戶端和伺服器)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.