C++网络编程-基于TCP的网络编程

转载自CSDN

服务器端操作

  1. 创建服务器套接字(create)。
  2. 服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
  3. 接受来自用户端的连接请求(accept)。
  4. 开始数据传输(send/receive)。
  5. 关闭套接字(closesocket)。

客户端操作

  1. 创建客户套接字(create)。
  2. 与远程服务器进行连接(connect),如被接受则创建接收进程。
  3. 开始数据传输(send/receive)。
  4. 关闭套接字(closesocket)。

server.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h> //WindowsSocket编程头文件
#include<iostream>
#include<cstring>
#pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
using namespace std;

//================全局常量==================
//创建缓冲区
const int BUF_SIZE = 2048;
//================全局变量==================
SOCKET sockSer, sockCli;
SOCKADDR_IN addrSer, addrCli; //address
int naddr = sizeof(SOCKADDR_IN);

char sendbuf[BUF_SIZE];
char inputbuf[BUF_SIZE];
char recvbuf[BUF_SIZE];
//================函数声明==================
int main() {
cout << "服务器启动" << endl;
//加载socket库
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
{
//输出出错信息
cout << "载入socket库失败!" << endl;
system("pause");
return 0;
}
else {
cout << "载入socket库成功!" << endl;
}
//创建Socket;
sockSer = socket(AF_INET, SOCK_STREAM, 0);
//描述协议族,INET属于ipv4;
//sock_stream创建套接字类型:tcp;
//0不指定协议,常用的协议有tcp、udp等

//初始化地址包
addrSer.sin_addr.s_addr = inet_addr("10.118.26.2");
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(1111);

//绑定Socket(bind)
bind(sockSer, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));
//强制将SOCKADDR_INET转化成SOCKEADDR

//监听
while (true) {
cout << "开始连接!" << endl;
//监听连接请求;
listen(sockSer, 5);
//等待连接最大数:5

//接受连接
sockCli = accept(sockSer, (SOCKADDR*)&addrCli, &naddr);
if (sockCli != INVALID_SOCKET) {
while (true)
{
cout << "连接成功" << endl;
cout << "请输入要发送给客户端的信息:" << endl;
cin >> sendbuf;
send(sockCli, sendbuf, sizeof(sendbuf), 0);
//strcpy(sendbuf, "hello");
//send(sockCli, sendbuf, sizeof(sendbuf), 0);

//接收客户端发来信息
recv(sockCli, recvbuf, sizeof(recvbuf), 0);
cout << "客户端发来的信息:" << recvbuf << endl;
}

}
else
{
cout << "连接失败!" << endl;
}
}
closesocket(sockSer);
closesocket(sockCli);
return 0;

}

client.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h> //WindowsSocket编程头文件
#include<iostream>
#include<cstring>
#pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
using namespace std;

//================全局常量==================
//创建缓冲区
const int BUF_SIZE = 2048;
//================全局变量==================
SOCKET sockSer, sockCli;
SOCKADDR_IN addrSer, addrCli; //address
int naddr = sizeof(SOCKADDR_IN);

char sendbuf[BUF_SIZE];
char inputbuf[BUF_SIZE];
char recvbuf[BUF_SIZE];
//================函数声明==================
int main() {
//加载socket库
cout << "客户端启动" << endl;
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
{
//输出出错信息
cout << "载入socket库" << endl;
system("pause");
return 0;
}
//创建Soucket;
sockCli = socket(AF_INET, SOCK_STREAM, 0);
//描述协议族,INET属于ipv4;
//sock_stream创建套接字类型:tcp;
//0不指定协议,常用的协议有tcp、udp等

//初始化客户端地址包
addrCli.sin_addr.s_addr = inet_addr("127.0.0.1");
addrCli.sin_family = AF_INET;
addrCli.sin_port = htons(1111);

//初始化服务器地址
addrSer.sin_addr.s_addr = inet_addr("10.118.26.2");
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(1111);

while (true)
{
if (connect(sockCli, (SOCKADDR*)&addrSer, sizeof(addrSer)) != SOCKET_ERROR)
{
while (true)
{
//接收服务器信息
cout << "客户端连接成功" << endl;
recv(sockCli, recvbuf, sizeof(recvbuf), 0);
cout << "服务端发的信息:" << recvbuf << endl;
//发送给服务器信息
cout << "请输入要发送给服务器的信息:" << endl;
cin >> sendbuf;

send(sockCli, sendbuf, sizeof(sendbuf), 0);
cout << "发送成功" << endl;
}

}
else
{
//cout << "客户端连接失败" << endl;
}
}
closesocket(sockSer);
closesocket(sockCli);
return 0;
}