//服务器
#include<iostream>
#include <Winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
SOCKET sockSrv;
SOCKADDR_IN addrSrv;
SOCKADDR_IN addrClient;//用来接受客户端的地址信息
int len = sizeof(SOCKADDR);
int err;
WORD wVersionRequested;//用来保存Winsock库的版本号
wVersionRequested = MAKEWORD(2, 2);//创建一个包含了请求版本号的WORD值
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
cout << "启动使用Winsock DLL失败" << endl;
return 0;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
cout << "启动使用Winsock DLL失败" << endl;
return 0;
}
sockSrv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//将套接字绑定到本地址和指定端口号上
listen(sockSrv, 5);
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
//多线程从这里开启
//while循环实际是添加到这里,程序运行到这里会进行中断。跳出中断时,表示有客户端连接。进行多
//线程编程则可以从这里开启线程(本实例为了达到单线程通信(服务器<->客服端),将消息循环接收放在下
//面的循环里了),例如聊天软件,可以从这里开启多线程消息处理后将消息转发到sockConn对应的客户端,
//就形成了两个客户端间的通信
//addrClient包含了连接的客户端的IP地址
cout << "欢迎你加入" << endl;
send(sockConn, "欢迎你加入", 20, 0);//用返回的套接字和客户端进行通信。
while (true)
{
char sendBuf[256];
char recvBuf[256];
recv(sockConn, recvBuf, strlen(recvBuf),0);
Sleep(1000);
if (strlen(recvBuf) > 0)
{
cout << recvBuf << endl;
cout << "Input:";
cin >> sendBuf;
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);//用返回的套接字和客户端进行通信。
}
}
closesocket(sockConn);
system("pause");
return 0;
}
//客户端
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#include <Winsock2.h>
#include<stdlib.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
int main()
{
WORD wVersinRequested;
WSADATA wsaData;
int err;
wVersinRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersinRequested, &wsaData);
if (err != 0)
{
cout << "启动使用Winsock DLL失败" << endl;
return 0;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
cout << "启动使用Winsock DLL失败" << endl;
return 0;
}
SOCKADDR_IN addrSrv;//设定服务器端的IP和端口
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//本地回路地址
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);//将其第三个参数设为0,让其自动选择协议。
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//与服务器建立连接。
Sleep(2000);
while (1)
{
char recvBuf[100];
char sendBuf[100];
recv(sockClient, recvBuf, 100, 0);
Sleep(1000);
if (strlen(recvBuf) > 0)
{
cout << recvBuf << endl;
cout << "Input:";
cin >> sendBuf;
send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
}
}
closesocket(sockClient);
WSACleanup();
system("pause");
}
参考网站来源:https://blog.youkuaiyun.com/ch_jinyi/article/details/7439742