C++ socket 通信客户端和服务器端
生活随笔
收集整理的這篇文章主要介紹了
C++ socket 通信客户端和服务器端
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
??????????? #include <iostream> #include <stdio.h> #include <windows.h> //一定要包含該頭文件 #pragma comment(lib, "WS2_32.lib") //windwows下的socket編程函數(shù)庫 using namespace std; int main() { WSADATA wsaData; WORD sockVersion = MAKEWORD(2, 2); //windows網(wǎng)絡(luò)編程庫的版本號信息SOCKET sock = 0; //TCP通信的socket數(shù)據(jù)結(jié)構(gòu) if (WSAStartup(sockVersion, &wsaData) != 0) //WSAStartup函數(shù)是在程序中初始化并加載Windows網(wǎng)絡(luò){ cout << "initlization failed!" << endl; exit(0); //如果WSAStartup返回值為1的話就表示ws2_32.dll文件有問題,程序退出} sock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //在本機(jī)上創(chuàng)建一個socket if (sock == INVALID_SOCKET) //判斷socket是否創(chuàng)建成功{ cout << "failed socket!" << endl; return 0; //如果創(chuàng)建失敗就在程序中返回0結(jié)束程序} sockaddr_in sin; //創(chuàng)建一個socket編程類型的網(wǎng)絡(luò)地址數(shù)據(jù)結(jié)構(gòu)以便connect函數(shù)對本機(jī)創(chuàng)建的socket數(shù)據(jù)//結(jié)構(gòu)進(jìn)行初始化。sin.sin_family = AF_INET; //設(shè)置網(wǎng)絡(luò)協(xié)議族類型sin.sin_port = htons(4567); //設(shè)置遠(yuǎn)程計(jì)算機(jī)的端口號sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//設(shè)置遠(yuǎn)程計(jì)算機(jī)的IP地址 if (connect(sock, (sockaddr*)&sin, sizeof(sockaddr)) == -1) //初始化socket并連接遠(yuǎn)程計(jì)算機(jī){ cout << "connect failed!" << endl; return 0; //連接失敗就返回0到程序} char buffer[256] = "\0"; //聲明一個從網(wǎng)絡(luò)接收數(shù)據(jù)的緩存區(qū)int nRecv = 0; //聲明一個從網(wǎng)絡(luò)接收到的數(shù)據(jù)字節(jié)長度 nRecv = recv(sock, buffer, 256, 0); //recv是一個接收網(wǎng)絡(luò)的TCP數(shù)據(jù)包函數(shù),nRecv是從網(wǎng)絡(luò)接收到數(shù)//據(jù)的字節(jié)長度 if (nRecv > 0) { buffer[nRecv] = '\0'; //如果接收到網(wǎng)絡(luò)數(shù)據(jù)包長度大于0的話就在接收到的數(shù)據(jù)包未尾添加一個字符串//結(jié)束符 cout << "reveive data: " << buffer << endl;//按字符串格式輸出接收到的數(shù)據(jù) } closesocket(sock); //關(guān)閉這個TCP網(wǎng)絡(luò)通信連接WSACleanup(); //釋放ws2_32.dll動態(tài)庫} //服務(wù)端: #include <iostream> #include <stdio.h> #include <windows.h> //一定要包含該頭文件using namespace std; #pragma comment(lib, "WS2_32.lib") //windwows下的socket編程函數(shù)庫int main() { WSADATA wsaData; WORD sockVersion = MAKEWORD(2, 2); //windows網(wǎng)絡(luò)編程庫的版本號信息SOCKET sListen = 0; //TCP通信的socket數(shù)據(jù)結(jié)構(gòu)sockaddr_in sin = {0}; //創(chuàng)建一個socket編程類型的網(wǎng)絡(luò)地址數(shù)據(jù)結(jié)構(gòu)這個用于本地sockaddr_in remoteAddr = {0};//創(chuàng)建一個socket編程類型的網(wǎng)絡(luò)地址數(shù)據(jù)結(jié)構(gòu)這個用于儲存遠(yuǎn)程主機(jī)的//IP地址和端口號 char szText[] = "TCP Server Demo"; int nAddrLen = 0; nAddrLen = sizeof(sockaddr_in); //計(jì)算這個sockaddr_in數(shù)據(jù)結(jié)構(gòu)的大小sin.sin_port = htons(4567); //設(shè)置本地(這里指服務(wù)端)計(jì)算機(jī)要打開的端口sin.sin_family = AF_INET; //設(shè)置網(wǎng)絡(luò)通信的網(wǎng)絡(luò)協(xié)議族類型sin.sin_addr.S_un.S_addr = INADDR_ANY; //設(shè)置本地計(jì)算機(jī)的IP地址,一般INADDR_ANY在程序運(yùn)行時//會自動計(jì)算成本地的IP地址的//init wsa if (WSAStartup(sockVersion, &wsaData) != 0)//WSAStartup函數(shù)是在程序中初始化并加載Windows網(wǎng)絡(luò){ cout << "initlization failed!" << endl; exit(0); //如果WSAStartup返回值為1的話就表示ws2_32.dll文件有問題,程序退出} sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //在本機(jī)上創(chuàng)建一個socket//使用bind函數(shù)綁定本機(jī)的ip和打開端口到本機(jī)創(chuàng)建的socket結(jié)構(gòu)上,并初始化該socket//重點(diǎn)說明一個在服務(wù)器上是用bind函數(shù)來初始化socket,在客戶機(jī)上是用connect函數(shù)來初始化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是用來打開本地計(jì)算機(jī)的端口,參數(shù)2表示客戶端同//時連接服務(wù)器的數(shù)量,這里是說可以同時有2個客戶端連接//到本機(jī)打開的端口{ cout << "listen failed!" << endl; return 0; //如果打開本地端口失敗就返回0并退出程序 } SOCKET sClient = INADDR_ANY; //再服務(wù)器上再創(chuàng)建一個socket結(jié)構(gòu),用來儲存與一個客戶端進(jìn)行通信連//接的連接實(shí)例 while (true) { //accept函數(shù)是用來創(chuàng)建一個TCP通信連接實(shí)例的,他使用一個遠(yuǎn)程計(jì)算機(jī)的IP地址和本地計(jì)算機(jī)上創(chuàng)建的一個//socket,這兩個信息來創(chuàng)建一個本地計(jì)算機(jī)到遠(yuǎn)程計(jì)算機(jī)的一個TCP通信連接實(shí)例的socket,sClient就是當(dāng)前//程序中的這個連接實(shí)例的socket 了。注accept函數(shù)也可以直接理解為接受一個客戶機(jī)的連接請求。 sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); if (sClient == INVALID_SOCKET) { cout << "accept failed!" << endl; continue; //如果本地計(jì)算機(jī)(服務(wù)器)接受一個客戶端連接請求失敗就退出監(jiān)聽狀態(tài)} //send函數(shù)是在TCP連接建立之后,就來發(fā)送數(shù)據(jù)的。其中sClient是存放有一個連接實(shí)例的socket結(jié)構(gòu)來//的。這個服務(wù)器上的send函數(shù)的socket參數(shù)和客戶機(jī)上的socket參數(shù)是不同的喔,記住這里的socket參數(shù)是通過//accept函數(shù)創(chuàng)建的喔。不是用connet函數(shù)和bind函數(shù)創(chuàng)建喔。一定要記住這個sClient是一個關(guān)鍵來的。然后//szText就是我們想要發(fā)送的數(shù)據(jù)了。這里我們向連接到該服務(wù)器的客戶端發(fā)送了一個“TCP Server Demo”的信息。send(sClient, szText, strlen(szText), 0); closesocket(sClient); //關(guān)閉這個用accept函數(shù)建立socket對象,關(guān)閉與remoteAddr連接通信。//remoteAddr這結(jié)構(gòu)理包含了有遠(yuǎn)程計(jì)算機(jī)的IP和端口號信息,當(dāng)客戶機(jī)//使用connect函數(shù)發(fā)送一個連接請求時,被accept函數(shù)接受并處理后,遠(yuǎn)//程計(jì)算機(jī)的IP地址和端口信息就被填到了remoteAddr這個結(jié)構(gòu)中去} closesocket(sListen); //關(guān)閉本地計(jì)算機(jī)(服務(wù)器)上的由bind函數(shù)創(chuàng)建的socket對象,關(guān)閉本機(jī)//打開的端口,關(guān)閉服務(wù)器 WSACleanup(); //釋放ws2_32.dll動態(tài)庫}- 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
總結(jié)
以上是生活随笔為你收集整理的C++ socket 通信客户端和服务器端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何让自己的内心强大起来
- 下一篇: 苦逼的程序员怎么发展