/*** TCP服务器通信基本流程* zhangyl 2018年12月13日*/#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>#include <iostream>#include <string.h>#include <vector>int main(int argc, char* argv[]){//1.创建一个侦听socketint listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd == -1){std::cout << "create listen socket error." << std::endl;return -1;}//2.初始化服务器地址struct sockaddr_in bindaddr;bindaddr.sin_family = AF_INET;bindaddr.sin_addr.s_addr = htonl(INADDR_ANY);bindaddr.sin_port = htons(3000);if (bind(listenfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr)) == -1){std::cout << "bind listen socket error." << std::endl;close(listenfd);return -1;}//3.启动侦听if (listen(listenfd, SOMAXCONN) == -1){std::cout << "listen error." << std::endl;close(listenfd);return -1;}//记录所有客户端连接的容器std::vector<int> clientfds;while (true){struct sockaddr_in clientaddr;socklen_t clientaddrlen = sizeof(clientaddr);//4. 接受客户端连接int clientfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clientaddrlen);if (clientfd != -1){char recvBuf[32] = {0};//5. 从客户端接受数据int ret = recv(clientfd, recvBuf, 32, 0);if (ret > 0){std::cout << "recv data from client, data: " << recvBuf << std::endl;//6. 将收到的数据原封不动地发给客户端ret = send(clientfd, recvBuf, strlen(recvBuf), 0);if (ret != strlen(recvBuf))std::cout << "send data error." << std::endl;std::cout << "send data to client successfully, data: " << recvBuf << std::endl;}else{std::cout << "recv data error." << std::endl;}//close(clientfd);clientfds.push_back(clientfd);}}//7.关闭侦听socketclose(listenfd);return 0;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。