生活随笔
收集整理的這篇文章主要介紹了
如何让服务器端持续监听客户端的请求?
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前面的程序,不管服務(wù)器端還是客戶(hù)端,都有一個(gè)問(wèn)題,就是處理完一個(gè)請(qǐng)求立即退出了,沒(méi)有太大的實(shí)際意義。能不能像Web服務(wù)器那樣一直接受客戶(hù)端的請(qǐng)求呢?能,使用 while 循環(huán)即可。 修改前面的回聲程序,使服務(wù)器端可以不斷響應(yīng)客戶(hù)端的請(qǐng)求。 服務(wù)器端 server.cpp:
#include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") //加載 ws2_32.dll ? #define BUF_SIZE 100 ? int main(){ WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData); ? //創(chuàng)建套接字 SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0); ? //綁定套接字 sockaddr_in sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); //每個(gè)字節(jié)都用0填充 sockAddr.sin_family = PF_INET; //使用IPv4地址 sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具體的IP地址 sockAddr.sin_port = htons(1234); //端口 bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)); ? //進(jìn)入監(jiān)聽(tīng)狀態(tài) listen(servSock, 20); ? //接收客戶(hù)端請(qǐng)求 SOCKADDR clntAddr; int nSize = sizeof(SOCKADDR); char buffer[BUF_SIZE] = {0}; //緩沖區(qū) while(1){ SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize); int strLen = recv(clntSock, buffer, BUF_SIZE, 0); //接收客戶(hù)端發(fā)來(lái)的數(shù)據(jù) send(clntSock, buffer, strLen, 0); //將數(shù)據(jù)原樣返回 ? closesocket(clntSock); //關(guān)閉套接字 memset(buffer, 0, BUF_SIZE); //重置緩沖區(qū) } ? //關(guān)閉套接字 closesocket(servSock); ? //終止 DLL 的使用 WSACleanup(); ? return 0; }
客戶(hù)端 client.cpp:
#include <stdio.h> #include <WinSock2.h> #include <windows.h> #pragma comment(lib, "ws2_32.lib") //加載 ws2_32.dll ? #define BUF_SIZE 100 ? int main(){ //初始化DLL WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); ? //向服務(wù)器發(fā)起請(qǐng)求 sockaddr_in sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); //每個(gè)字節(jié)都用0填充 sockAddr.sin_family = PF_INET; sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); sockAddr.sin_port = htons(1234); ? char bufSend[BUF_SIZE] = {0}; char bufRecv[BUF_SIZE] = {0}; ? while(1){ //創(chuàng)建套接字 SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)); //獲取用戶(hù)輸入的字符串并發(fā)送給服務(wù)器 printf("Input a string: "); gets(bufSend); send(sock, bufSend, strlen(bufSend), 0); //接收服務(wù)器傳回的數(shù)據(jù) recv(sock, bufRecv, BUF_SIZE, 0); //輸出接收到的數(shù)據(jù) printf("Message form server: %s\n", bufRecv); ? memset(bufSend, 0, BUF_SIZE); //重置緩沖區(qū) memset(bufRecv, 0, BUF_SIZE); //重置緩沖區(qū) closesocket(sock); //關(guān)閉套接字 } ? WSACleanup(); //終止使用 DLL return 0; }
先運(yùn)行服務(wù)器端,再運(yùn)行客戶(hù)端,結(jié)果如下: Input a string: c language Message form server: c language Input a string:?C語(yǔ)言中文網(wǎng) Message form server: C語(yǔ)言中文網(wǎng) Input a string: 學(xué)習(xí)C/C++編程的好網(wǎng)站 Message form server: 學(xué)習(xí)C/C++編程的好網(wǎng)站 while(1) 讓代碼進(jìn)入死循環(huán),除非用戶(hù)關(guān)閉程序,否則服務(wù)器端會(huì)一直監(jiān)聽(tīng)客戶(hù)端的請(qǐng)求。客戶(hù)端也是一樣,會(huì)不斷向服務(wù)器發(fā)起連接。 需要注意的是:server.cpp 中調(diào)用 closesocket() 不僅會(huì)關(guān)閉服務(wù)器端的 socket,還會(huì)通知客戶(hù)端連接已斷開(kāi),客戶(hù)端也會(huì)清理 socket 相關(guān)資源,所以 client.cpp 中需要將 socket() 放在 while 循環(huán)內(nèi)部,因?yàn)槊看握?qǐng)求完畢都會(huì)清理 socket,下次發(fā)起請(qǐng)求時(shí)需要重新創(chuàng)建。后續(xù)我們會(huì)進(jìn)行詳細(xì)講解。
總結(jié)
以上是生活随笔 為你收集整理的如何让服务器端持续监听客户端的请求? 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。