本文学习相关资料:
C/C++ socket编程教程
环境:vs2015
源码:本文代码
在这里c++ socket学习(1.1)学到了怎么样建立TCP,然后通过TCP连接发送、接收信息。
但是都是一次性的,当时是接收信息后就结束了,最多加个输出把接收的信息打印出来,现在来看一下怎么一直接收信息,直到程序接收到退出命令。
服务端
其实很简单,做个死循环就行了,这样程序就会一直在接收客户端发送过来的信息,直到客户端发送exit
sockaddr_in servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);memset(&sockAddr, 0, sizeof(sockAddr));//初始化
sockAddr.sin_family = AF_INET; //同上,即使用ipv4
sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //说明要监听的ip地址
sockAddr.sin_port = htons(9000); //说明要监听的端口号
//IP和端口与套接字绑定起来,监听sockAddr设置的ip地址和端口号
bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
listen(servSock, 20);sockaddr_in clntAddr;
//初始化clntAddr
memset(&clntAddr, sizeof(SOCKADDR), 0);
//使用accept返回的套接字clntSock来与响应的客户端进行交流,即响应客户端的connect
SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
while (1) {int len = recv(clntSock, buf, maxlen, 0);std::string s(buf);if (s.compare("exit") == 0) {std::cout << "接收到关闭信息,关闭服务器" << std::endl;break;}std::cout << s << std::endl;
}
//关闭套接字
closesocket(clntSock);
客户端
SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(sockaddr_in));
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servAddr.sin_port = htons(9000);
servAddr.sin_family = AF_INET;//连接到服务端
connect(client, (sockaddr*)&servAddr, sizeof(sockaddr_in));
//循环
while (1) {std::string s;//连接std::cout << "请输入内容(长度为100个字符):";std::cin >> s;//这里就是发送数据了send(client, s.c_str(), s.size() + 1, 0);if (s.compare("exit") == 0) {break;}
}
//关闭套接字
closesocket(client);
记得在程序开头说明所用的winsock 版本号