日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ socket 通信客户端和服务器端

發布時間:2023/12/18 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ socket 通信客户端和服务器端 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


?

??????????? #include <iostream> #include <stdio.h> #include <windows.h> //一定要包含該頭文件 #pragma comment(lib, "WS2_32.lib") //windwows下的socket編程函數庫 using namespace std; int main() { WSADATA wsaData; WORD sockVersion = MAKEWORD(2, 2); //windows網絡編程庫的版本號信息SOCKET sock = 0; //TCP通信的socket數據結構 if (WSAStartup(sockVersion, &wsaData) != 0) //WSAStartup函數是在程序中初始化并加載Windows網絡{ cout << "initlization failed!" << endl; exit(0); //如果WSAStartup返回值為1的話就表示ws2_32.dll文件有問題,程序退出} sock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //在本機上創建一個socket if (sock == INVALID_SOCKET) //判斷socket是否創建成功{ cout << "failed socket!" << endl; return 0; //如果創建失敗就在程序中返回0結束程序} sockaddr_in sin; //創建一個socket編程類型的網絡地址數據結構以便connect函數對本機創建的socket數據//結構進行初始化。sin.sin_family = AF_INET; //設置網絡協議族類型sin.sin_port = htons(4567); //設置遠程計算機的端口號sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//設置遠程計算機的IP地址 if (connect(sock, (sockaddr*)&sin, sizeof(sockaddr)) == -1) //初始化socket并連接遠程計算機{ cout << "connect failed!" << endl; return 0; //連接失敗就返回0到程序} char buffer[256] = "\0"; //聲明一個從網絡接收數據的緩存區int nRecv = 0; //聲明一個從網絡接收到的數據字節長度 nRecv = recv(sock, buffer, 256, 0); //recv是一個接收網絡的TCP數據包函數,nRecv是從網絡接收到數//據的字節長度 if (nRecv > 0) { buffer[nRecv] = '\0'; //如果接收到網絡數據包長度大于0的話就在接收到的數據包未尾添加一個字符串//結束符 cout << "reveive data: " << buffer << endl;//按字符串格式輸出接收到的數據 } closesocket(sock); //關閉這個TCP網絡通信連接WSACleanup(); //釋放ws2_32.dll動態庫} //服務端: #include <iostream> #include <stdio.h> #include <windows.h> //一定要包含該頭文件using namespace std; #pragma comment(lib, "WS2_32.lib") //windwows下的socket編程函數庫int main() { WSADATA wsaData; WORD sockVersion = MAKEWORD(2, 2); //windows網絡編程庫的版本號信息SOCKET sListen = 0; //TCP通信的socket數據結構sockaddr_in sin = {0}; //創建一個socket編程類型的網絡地址數據結構這個用于本地sockaddr_in remoteAddr = {0};//創建一個socket編程類型的網絡地址數據結構這個用于儲存遠程主機的//IP地址和端口號 char szText[] = "TCP Server Demo"; int nAddrLen = 0; nAddrLen = sizeof(sockaddr_in); //計算這個sockaddr_in數據結構的大小sin.sin_port = htons(4567); //設置本地(這里指服務端)計算機要打開的端口sin.sin_family = AF_INET; //設置網絡通信的網絡協議族類型sin.sin_addr.S_un.S_addr = INADDR_ANY; //設置本地計算機的IP地址,一般INADDR_ANY在程序運行時//會自動計算成本地的IP地址的//init wsa if (WSAStartup(sockVersion, &wsaData) != 0)//WSAStartup函數是在程序中初始化并加載Windows網絡{ cout << "initlization failed!" << endl; exit(0); //如果WSAStartup返回值為1的話就表示ws2_32.dll文件有問題,程序退出} sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //在本機上創建一個socket//使用bind函數綁定本機的ip和打開端口到本機創建的socket結構上,并初始化該socket//重點說明一個在服務器上是用bind函數來初始化socket,在客戶機上是用connect函數來初始化socket的喔if (bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { cout << "bind failed!" << endl; return 0; //如果socket綁定失敗返回程序0并退出程序} if (listen(sListen, 2) == SOCKET_ERROR) //listen是用來打開本地計算機的端口,參數2表示客戶端同//時連接服務器的數量,這里是說可以同時有2個客戶端連接//到本機打開的端口{ cout << "listen failed!" << endl; return 0; //如果打開本地端口失敗就返回0并退出程序 } SOCKET sClient = INADDR_ANY; //再服務器上再創建一個socket結構,用來儲存與一個客戶端進行通信連//接的連接實例 while (true) { //accept函數是用來創建一個TCP通信連接實例的,他使用一個遠程計算機的IP地址和本地計算機上創建的一個//socket,這兩個信息來創建一個本地計算機到遠程計算機的一個TCP通信連接實例的socket,sClient就是當前//程序中的這個連接實例的socket 了。注accept函數也可以直接理解為接受一個客戶機的連接請求。 sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); if (sClient == INVALID_SOCKET) { cout << "accept failed!" << endl; continue; //如果本地計算機(服務器)接受一個客戶端連接請求失敗就退出監聽狀態} //send函數是在TCP連接建立之后,就來發送數據的。其中sClient是存放有一個連接實例的socket結構來//的。這個服務器上的send函數的socket參數和客戶機上的socket參數是不同的喔,記住這里的socket參數是通過//accept函數創建的喔。不是用connet函數和bind函數創建喔。一定要記住這個sClient是一個關鍵來的。然后//szText就是我們想要發送的數據了。這里我們向連接到該服務器的客戶端發送了一個“TCP Server Demo”的信息。send(sClient, szText, strlen(szText), 0); closesocket(sClient); //關閉這個用accept函數建立socket對象,關閉與remoteAddr連接通信。//remoteAddr這結構理包含了有遠程計算機的IP和端口號信息,當客戶機//使用connect函數發送一個連接請求時,被accept函數接受并處理后,遠//程計算機的IP地址和端口信息就被填到了remoteAddr這個結構中去} closesocket(sListen); //關閉本地計算機(服務器)上的由bind函數創建的socket對象,關閉本機//打開的端口,關閉服務器 WSACleanup(); //釋放ws2_32.dll動態庫}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147

總結

以上是生活随笔為你收集整理的C++ socket 通信客户端和服务器端的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。