反响客户端的完成

所谓“反响”,是指客户端向效劳器发送一条数据,效劳器再将数据原样前往给客户端,就像声响一样,碰到妨碍物会被“反弹回来”。
对!客户端也可以运用 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 效劳器就是典型的例子,恳求的网址分歧,前往的页面也分歧。


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