網絡編程:我們都應該知道服務端和客戶端C/S模式,下面我們遵循一個網絡編程的規律:
服務端:socket ——> bind ——> listen ——> accept
客戶端:socket ——> connect
下面就是代碼部分,遵循了上面的規律,大家不懂的函數可以百度查看含義
服務端代碼:
// server.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。 #include <iostream> #include <winsock.h> #pragma comment(lib,"ws2_32.lib") using namespace std; void initialization(); int main() { //定義長度變量 int send_len = 0; int recv_len = 0; int len = 0; //定義發送緩沖區和接受緩沖區 char send_buf[100]; char recv_buf[100]; //定義服務端套接字,接受請求套接字 SOCKET s_server; SOCKET s_accept; //服務端地址客戶端地址 SOCKADDR_IN server_addr; SOCKADDR_IN accept_addr; initialization(); //填充服務端信息 server_addr.sin_family = AF_INET; server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(5010); //創建套接字 s_server = socket(AF_INET, SOCK_STREAM, 0); if (bind(s_server, (SOCKADDR*)& server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) { cout << "套接字綁定失敗!" << endl; WSACleanup(); } else { cout << "套接字綁定成功!" << endl; } //設置套接字為監聽狀態 if (listen(s_server, SOMAXCONN) < 0) { cout << "設置監聽狀態失敗!" << endl; WSACleanup(); } else { cout << "設置監聽狀態成功!" << endl; } cout << "服務端正在監聽連接,請稍候...." << endl; //接受連接請求 len = sizeof(SOCKADDR); s_accept = accept(s_server, (SOCKADDR*)& accept_addr, &len); if (s_accept == SOCKET_ERROR) { cout << "連接失敗!" << endl; WSACleanup(); return 0; } cout << "連接建立,准備接受數據" << endl; //接收數據 while (1) { recv_len = recv(s_accept, recv_buf, 100, 0); if (recv_len < 0) { cout << "接受失敗!" << endl; break; } else { cout << "客戶端信息:" << recv_buf << endl; } cout << "請輸入回復信息:"; cin >> send_buf; send_len = send(s_accept, send_buf, 100, 0); if (send_len < 0) { cout << "發送失敗!" << endl; break; } } //關閉套接字 closesocket(s_server); closesocket(s_accept); //釋放DLL資源 WSACleanup(); return 0; } void initialization() { //初始化套接字庫 WORD w_req = MAKEWORD(2, 2);//版本號 WSADATA wsadata; int err; err = WSAStartup(w_req, &wsadata); if (err != 0) { cout << "初始化套接字庫失敗!" << endl; } else { cout << "初始化套接字庫成功!" << endl; } //檢測版本號 if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) { cout << "套接字庫版本號不符!" << endl; WSACleanup(); } else { cout << "套接字庫版本正確!" << endl; } //填充服務端地址信息 }
客戶端代碼
// client.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。 #include<iostream> #include<winsock.h> #pragma comment(lib,"ws2_32.lib") using namespace std; void initialization(); int main() { //定義長度變量 int send_len = 0; int recv_len = 0; //定義發送緩沖區和接受緩沖區 char send_buf[100]; char recv_buf[100]; //定義服務端套接字,接受請求套接字 SOCKET s_server; //服務端地址客戶端地址 SOCKADDR_IN server_addr; initialization(); //填充服務端信息 server_addr.sin_family = AF_INET; server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); server_addr.sin_port = htons(5010); //創建套接字 s_server = socket(AF_INET, SOCK_STREAM, 0); if (connect(s_server, (SOCKADDR*)& server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) { cout << "服務器連接失敗!" << endl; WSACleanup(); } else { cout << "服務器連接成功!" << endl; } //發送,接收數據 while (1) { cout << "請輸入發送信息:"; cin >> send_buf; send_len = send(s_server, send_buf, 100, 0); if (send_len < 0) { cout << "發送失敗!" << endl; break; } recv_len = recv(s_server, recv_buf, 100, 0); if (recv_len < 0) { cout << "接受失敗!" << endl; break; } else { cout << "服務端信息:" << recv_buf << endl; } } //關閉套接字 closesocket(s_server); //釋放DLL資源 WSACleanup(); return 0; } void initialization() { //初始化套接字庫 WORD w_req = MAKEWORD(2, 2);//版本號 WSADATA wsadata; int err; err = WSAStartup(w_req, &wsadata); if (err != 0) { cout << "初始化套接字庫失敗!" << endl; } else { cout << "初始化套接字庫成功!" << endl; } //檢測版本號 if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) { cout << "套接字庫版本號不符!" << endl; WSACleanup(); } else { cout << "套接字庫版本正確!" << endl; } //填充服務端地址信息 }