Windows网络编程:基于Scoket最简单的CS
一.简介
socket顾名思义就是套接字的意思,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。
socket编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW),前两者较常用。基于TCP的socket编程是流式套接字。
二.客户端(Client)
#include <iostream>
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
const int BUF_SIZE = 64;
int RetVal;
WSADATA Wsd;
if(WSAStartup(MAKEWORD(2, 2), &Wsd) != 0)
{
cout << "初始化套接字动态库失败" << endl;
return -1;
}
SOCKET ServerSocket;
ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ServerSocket == INVALID_SOCKET)
{
cout << "创建套接字失败" << endl;
WSACleanup();
return -1;
}
SOCKADDR_IN ServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(2345);
ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
RetVal = connect(ServerSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));
if(RetVal == SOCKET_ERROR)
{
cout << "连接服务器失败" << endl;
closesocket(ServerSocket);
WSACleanup();
return -1;
}
char SendBuff[BUF_SIZE];
char RECVBuff[BUF_SIZE];
while(true)
{
ZeroMemory(SendBuff, BUF_SIZE);
cout << "向服务器发送数据" << endl;
cin >> SendBuff;
RetVal = send(ServerSocket, SendBuff, strlen(SendBuff), 0);
if(RetVal == SOCKET_ERROR)
{
cout << "发送数据失败" << endl;
closesocket(ServerSocket);
WSACleanup();
return -1;
}
ZeroMemory(RECVBuff, BUF_SIZE);
recv(ServerSocket, RECVBuff, BUF_SIZE, 0);
cout << "从服务器接收数据" << RECVBuff << endl;
}
closesocket(ServerSocket);
WSACleanup();
}
三.服务端(Server)
#include <iostream>
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
int RetVal;
WORD SocketVersion = MAKEWORD(2, 2);
WSADATA wsd;
if(WSAStartup(SocketVersion, &wsd) != 0)
{
cout << "绑定Socket库失败" <<endl;
}
SOCKET ServerSocket;
ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ServerSocket == INVALID_SOCKET)
{
cout << "创建服务器套接字失败" << endl;
WSACleanup();
return -1;
}
SOCKADDR_IN ServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(2345);
ServerAddr.sin_addr.S_un.S_addr = INADDR_ANY;
RetVal = bind(ServerSocket, (SOCKADDR*)&ServerAddr, sizeof(SOCKADDR_IN));
if(RetVal == SOCKET_ERROR)
{
cout << "套接字绑定失败" << endl;
closesocket(ServerSocket);
WSACleanup();
return -1;
}
RetVal = listen(ServerSocket, 2);
if(RetVal == SOCKET_ERROR)
{
cout << "套接字监听失败" << endl;
closesocket(ServerSocket);
WSACleanup();
return -1;
}
SOCKET ClientSocket;
SOCKADDR_IN ClientAddr;
int ClientAddrLen = sizeof(ClientAddr);
ClientSocket = accept(ServerSocket, (SOCKADDR*)&ClientAddr, &ClientAddrLen);
if(ClientSocket == INVALID_SOCKET)
{
cout << "接收客户端请求失败" << endl;
closesocket(ServerSocket);
WSACleanup();
return -1;
}
char ReceiveBuff[BUFSIZ];
char SendBuff[BUFSIZ];
while(true)
{
ZeroMemory(ReceiveBuff, BUFSIZ);
RetVal = recv(ClientSocket, ReceiveBuff, BUFSIZ, 0);
if(RetVal == SOCKET_ERROR)
{
cout << "接收数据失败" << endl;
closesocket(ServerSocket);
closesocket(ClientSocket);
WSACleanup();
return -1;
}
cout << "接收自客户端数据:" << ReceiveBuff << endl;
cout << "向客户端发送数据";
cin >> SendBuff;
send(ClientSocket, SendBuff, strlen(SendBuff), 0);
}
closesocket(ServerSocket);
closesocket(ClientSocket);
WSACleanup();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)