1.服务器端步骤:创建套接字,绑定,监听,接收连接(accept)
#include <iostream>
#include<windows.h>
#include<winsock2.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
void main()
{
//API提供的调用方可使用的最高版本号
WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA wsaData;
//向操作系统说明,我们要用哪个库文件,让该库文件与当前的应用程序绑定
//该函数执行成功后返回0
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
//应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来
//解除与Socket库的绑定并且释放Socket库所占用的系统资源
WSACleanup();
return;
}
//第一步:创建套接字
//SOCK_STREAM为TCP,SOCK_DGRAM为UDP
SOCKET socketSer = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSer, addrCli;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(5050); // 将主机字节顺序转为网络字节顺序
addrSer.sin_addr.S_un.S_addr = inet_addr("192.168.1.1");
//第二步:绑定套接字
bind(socketSer, (sockaddr*)&addrSer, sizeof(SOCKADDR));
//第三步:监听
listen(socketSer, 5); //第2个参数表示队列大小
cout << "Server Wait Client Connect......." << endl;
//第四步:接收连接
SOCKET sockConn = accept(socketSer, (sockaddr*)&addrCli, &(sizeof(SOCKADDR)));
if (sockConn == INVALID_SOCKET)//INVALID_SOCKET非法套接字
{
cout << "Server Accept Client Connect Fail" << endl;
return;
}
else
{
cout << "Server Accept Client Connect Success" << endl;
return;
}
char sendbuf[256];
char recvbuf[256];
while (1)
{
cout << "Ser:>";
cin >> sendbuf; //缓冲区
if (strcpy(sendbuf, "quit") == 0)
{
break;
}
send(sockConn, sendbuf, strlen(sendbuf) + 1, 0);//套接字,缓冲,长度
recv(sockConn, recvbuf, 256, 0);
cout << "Cli:>" << recvbuf << endl;
}
closesocket(socketSer);
WSACleanup();//清除版本信息
}
2.客户端步骤:创建套接字,连接服务器(connect)
#include<iostream>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStarup(wVersionRequested, &wsaData);
if (err != 0)
{
//tell the user that we could nto find a usable
//WinSock DLL;
return;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return;
}
//第一步:创建套接字
SOCKET sockCli;
sockCli = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSer;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(5050);
addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//第二步:向服务器发起连接请求
int res = connect(sockCli, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));//res为connect返回值 查阅相关函数,若为0则表示没有错误
if (res != 0)
{
cout << "Client Connect Servrer Fail!" << endl;
return;
}
else
{
cout << "Client Connect Servrer Success!" << endl;
}
char sendbuf[256];
char recvbuf[256];//发空间和接收空间
while (1)
{
//接收
recv(sockCli, recvbuf, 256, 0);
cout << "Ser:>" << recvbuf << endl;
cout << "Cli:>";
cin >> sendbuf;
if (strcmp(sendbuf, "quit") == 0)//客户端请求退出
{
break;
}
//发送
send(sockCli, sendbuf, strlen(sendbuf) + 1, 0);
}
closesocket(sockCli);
WSACleanup();
}
常见问题:待补充。。。