socket编程实现回声客户端
发布时间:2020-12-15 17:31:12 所属栏目:百科 来源:网络整理
导读:所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。 对!客户端也可以使用 write() / send() 函数向服务器发送数据,服务器也可以使用 read() / recv() 函数接收数据。 考虑到大部
所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。 对!客户端也可以使用 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,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,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,&wsaData); //创建套接字 SOCKET sock = socket(PF_INET,IPPROTO_TCP); //向服务器发起请求 sockaddr_in sockAddr; memset(&sockAddr,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,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,0); //输出接收到的数据 printf("Message form server: %sn",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 服务器就是典型的例子,请求的网址不同,返回的页面也不同。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |