反響客戶端的完成

所謂“反響”,是指客戶端向效勞器發送一條數據,效勞器再將數據原樣前往給客戶端,就像聲響一樣,碰到妨礙物會被“反彈回來”。
對!客戶端也可以運用 write() / send() 函數向效勞器發送數據,效勞器也可以運用 read() / recv() 函數接納數據。
思索到大局部初學者運用 Windows 操作零碎,本節將完成 Windows 下的反響程序,Linux 下稍作修正即可,不再給出代碼。
效勞器端 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); //創立套接字 SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0); //綁定套接字 sockaddr_in sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); //每一個字節都用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)); //進入監聽形態 listen(servSock, 20); //接納客戶端懇求 SOCKADDR clntAddr; int nSize = sizeof(SOCKADDR); SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize); char buffer[BUF_SIZE]; //緩衝區 int strLen = recv(clntSock, buffer, BUF_SIZE, 0); //接納客戶端發來的數據 send(clntSock, buffer, strLen, 0); //將數據原樣前往 //封閉套接字 closesocket(clntSock); closesocket(servSock); //終止 DLL 的運用 WSACleanup(); return 0; }


客戶端 client.cpp:

			#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") //加載 ws2_32.dll #define BUF_SIZE 100 int main(){ //初始化DLL WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); //創立套接字 SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //向效勞器提議懇求 sockaddr_in sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); //每一個字節都用0填充 sockAddr.sin_family = PF_INET; sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); sockAddr.sin_port = htons(1234); connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)); //獲取用戶輸出的字符串併發送給效勞器 char bufSend[BUF_SIZE] = {0}; printf("Input a string: "); scanf("%s", bufSend); send(sock, bufSend, strlen(bufSend), 0); //接納效勞器傳回的數據 char bufRecv[BUF_SIZE] = {0}; recv(sock, bufRecv, BUF_SIZE, 0); //輸入接納到的數據 printf("Message form server: %s\n", bufRecv); //封閉套接字 closesocket(sock); //終止運用 DLL WSACleanup(); system("pause"); return 0; }

先運轉效勞器端,再運轉客戶端,履行後果爲:
Input a string: c-language java cpp↙
Message form server: c-language
scanf() 讀取到空格時以爲一個字符串輸出完畢,所以只能讀取到“c-language”;假如不願望把空格作爲字符串的完畢符,可以運用 gets() 函數。
經過本程序可以發現,客戶端也可以向效勞器端發送數據,如許效勞器端就可以依據分歧的懇求作出分歧的呼應,http 效勞器就是典型的例子,懇求的網址分歧,前往的頁面也分歧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章