本文學習相關資料:
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 版本號