基于TCP/IP的通讯基本上都是利用SOCKET套接字进行数据通信,程序通常分为服务器端和用户端两部分。设计思路(visual studio下):ios
第一部分 服务器端
1、建立服务器套接字(create)。
2、服务器套接字进行信息绑定(bind),并开始监听链接(listen)。
3、接受来自用户端的链接请求(accept)。
4、开始数据传输(send/receive)。
5、关闭套接字(closesocket)。编程
第二部分 客户端
1、建立客户套接字(create)。
2、与远程服务器进行链接(connect),如被接受则建立接收进程。
3、开始数据传输(send/receive)。
4、关闭套接字(closesocket)。服务器
service:socket
#include
#include
#include //WindowsSocket编程头文件
#include
#include
#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;
}
//建立Soucket;
sockSer = socket(AF_INET, SOCK_STREAM, 0);
//描述协议族,INET属于ipv4;
//sock_stream建立套接字类型:tcp;
//0不指定协议,经常使用的协议有tcp、udp等
//初始化地址包
addrSer.sin_addr.s_addr = inet_addr("192.168.138.1");
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:tcp
#include
#include
#include //WindowsSocket编程头文件
#include
#include
#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("192.168.138.1");
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;
}