請教下,關于基于TCP協議的問題。
下面的代碼是未完成代碼,其中以服務端、與客服端互動為例子,客服端發送1串以上的字串,服務端recv函式在沒有呼叫的時候,呼叫只能讀取客服端發送的第一串字串(詳細示例看圖),后面的將丟棄。經過對recv函式的了解,該函式是采用copy函式方法把接收的資料復制在陣列中,我假設客服端輸入字串為一下:
“111”\n“222”\n“333”\n;
如果沒有處于recv函式接收的時候,那么就變成了“111\n\0222\n\0333\n\0”,在呼叫copy函式只是111,而沒有后面的字串,資料實際并沒有丟失。如果沒有丟失的話,能不能做到函式一直后臺呼叫呢?把接收的資料保存在stl容器里面在主調函式使用。



#########服務端:
#include<Windows.h>
#include<iostream>
#include<string>
#include<vector>
#include<iterator>
#include<algorithm>
#include<winsock.h>
char cd(void);
using namespace std;
void cc(vector<string> &a1, char a2[]);
void xs(vector<string> &a1);
int main(void) {
string fs;
char js[1024];
SOCKET tjz;
SOCKET tzj1;
SOCKADDR_IN fwq;
SOCKADDR_IN fwq1;
WORD z;
WSADATA bb;
z = MAKEWORD(2,2);
if (WSAStartup(z, &bb)) {
MessageBox(NULL, "錯誤", "程式錯誤,未能加載套接字庫!", MB_OK);
exit(1);
}
if (LOBYTE(bb.wVersion) != 2 || HIBYTE(bb.wVersion) != 2) {
MessageBox(NULL, "錯誤", "加載的版本號不符合要求!", MB_OK);
exit(1);
}
fwq.sin_family = AF_INET;
fwq.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
fwq.sin_port = htons(5000);
tjz = socket(AF_INET, SOCK_STREAM, 0);
if (bind(tjz, (SOCKADDR*)&fwq, sizeof(SOCKADDR)) == SOCKET_ERROR) {
MessageBox(NULL, "錯誤", "系結失敗!", MB_OK);
exit(1);
}
if (listen(tjz, 5) < 0) {
MessageBox(NULL, "錯誤", "監聽失敗!", MB_OK);
exit(1);
}
{
system("color b0");
cout << "等待客服端進入......";
}
int dx = sizeof(SOCKADDR);
tjz = accept(tjz, (SOCKADDR*)&fwq1, &dx);
if (tjz == SOCKET_ERROR) {
MessageBox(NULL, "錯誤", "接受連接失敗!", MB_OK);
exit(1);
}
vector<string> q1{ "內容如下:" };
while (1) {
switch (cd()) {
case 'A':
for (int w1 = 0; w1 < 10; w1++) {
recv(tjz, js, 1023, 0);
cc(q1, js);
xs(q1);
}
break;
case 'B':
xs(q1);
system("pause");
break;
case 'C':break;
}
}
return 0;
}
char cd(void) {
char q1;
SetConsoleTitle("歡迎光臨!->選單");
system("cls");
system("color b0");
cout << " 歡迎來到聊天系統(服務器端)\n\n";
cout << " ####################################################\n #";
cout << " #\n";
cout << " # A.查詢收到資訊! B.發送訊息! #\n";
cout << " # C.退出系統! D.待添加! #\n #";
cout << " #\n #";
cout << " #\n #";
cout << " #\n";
cout << " ####################################################\n";
cout << "\n 請輸入:____\b\b\b";
q1 = toupper(getchar());
while ((getchar()) != '\n');
if (q1 < 'A' || q1>'C') {
MessageBox(NULL, "選擇錯誤,回傳選單!", "警告", MB_OK);
system("cls");
q1 = cd();
}
return q1;
}
void cc(vector<string> &a1, char a2[]) {
system("cls");
string a3 = a2;
if (a3 != *(a1.end() - 1))
a1.push_back(a3);
}
void xs(vector<string> &a1) {
system("cls");
ostream_iterator<string, char> A(cout, "\n");
copy(a1.begin(), a1.end(), A);
}
##########客服端:
#include<Windows.h>
#include<iostream>
#include<string>
#include<memory>
#include<winsock.h>
using namespace std;
int main(void) {
string fs;
char js[100];
SOCKET tjz;
SOCKADDR_IN fwq;
WORD z;
WSADATA bb;
z = MAKEWORD(2, 2);
if (WSAStartup(z, &bb)) {
MessageBox(NULL, "程式錯誤,未能加載套接字庫!", "錯誤", MB_OK);
exit(1);
}
if (LOBYTE(bb.wVersion) != 2 || HIBYTE(bb.wVersion) != 2) {
MessageBox(NULL, "加載的版本號不符合要求!", "錯誤", MB_OK);
exit(1);
}
fwq.sin_family = AF_INET;
char qq[20];
cout << "輸入IP:";
cin >> qq;
fwq.sin_addr.S_un.S_addr = inet_addr(qq);
fwq.sin_port = htons(5000);
tjz = socket(AF_INET, SOCK_STREAM, 0);
if (connect(tjz, (SOCKADDR*)&fwq, sizeof(SOCKADDR)) == SOCKET_ERROR) {
MessageBox(NULL, "連接失敗!", "錯誤", MB_OK);
exit(1);
}
while (1) {
cout << "連接成功,輸入資訊。換行符結束:";
cin >> fs;
send(tjz, fs.c_str(), 100, 0);
}
return 0;
}
uj5u.com熱心網友回復:
還有就是這個只能局域網嗎?轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/225696.html
標籤:網絡通信
