最近一直在看Linux下网络编程,想着先在window下编写基于C/S模式的socket网络编程,想看socket API函数详细讲解的可以先看下面第一个参考文章。为了防止自己忘记,写下这边博客。
具体不多说 ,直接上代码,,,功能比较简单,,以后继续更新!
服务器端程序:
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib") //显示加载ws2_32.dll
using namespace std;
int main() {
std::cout << "-----服务器端-----" << std::endl;
//1.初始化WSA 因为WSAStartup函数完成对winsock服务的初始化
int Ret;
WSADATA wsadata;
if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0) {
printf("WSAStartup() failed with error %d\n", Ret);
WSACleanup();
}
//2.创建服务器的套接字
SOCKET sSocket;
sSocket = socket(AF_INET, SOCK_STREAM, 0); //socket协议簇,使用IPv4,流式套接字
if (SOCKET_ERROR == sSocket) {
std::cout << "服务器端套接字创建失败!" << std::endl;
}
else {
std::cout << "服务器端套接字创建成功!" << std::endl;
}
//3.绑定套接字 指定绑定的IP地址和端口号
sockaddr_in socketAddr; //创建地址结构体对象
socketAddr.sin_family = AF_INET;
socketAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
socketAddr.sin_port = htons(1234);
//4.服务器监听
if ((bind(sSocket, (SOCKADDR*)&socketAddr, sizeof(socketAddr)) == SOCKET_ERROR)) {
std::cout<<"绑定失败!"<<std::endl;
}
else {
std::cout<<"绑定成功!"<<std::endl;
}
//4.服务器监听
int slisten = listen(sSocket, 5); //最多监听5个请求
if (slisten == SOCKET_ERROR) {
std::cout << "监听失败!" << std::endl;
}
else {
std::cout << "监听成功!" << std::endl;
}
//5.接受请求
sockaddr_in remoteAddr;
SOCKET sClientSocket;
int _revSize = sizeof(remoteAddr);
sClientSocket = accept(sSocket, (SOCKADDR*)&remoteAddr, &_revSize);
if (sClientSocket == INVALID_SOCKET) {
std::cout << "服务端接收请求失败!" << std::endl;
}
else {
std::cout << "服务端接收请求成功!" << std::endl;
}
while (true) {
char recvBuf[2048] = {};
int reLen = recv(sClientSocket, recvBuf, 2048, 0);
cout << reLen << endl;
int sLen = send(sClientSocket, recvBuf, reLen, 0);
if (SOCKET_ERROR != reLen) {
cout << "服务器已经接收到数据!" << recvBuf<<endl;
reLen = SOCKET_ERROR;
}
}
6.发送/接收数据
//char recvBuf[1024] = {};
//int reLen = recv(sClientSocket, recvBuf, 1024, 0);
//int sLen = send(sClientSocket, recvBuf, reLen, 0);
//if (SOCKET_ERROR == reLen) {
// std::cout << "服务端发送数据失败!" << std::endl;
//}
//else {
// std::cout << "服务器接收数据:" << recvBuf << std::endl;
//}
//7. 关闭socket
closesocket(sClientSocket);
closesocket(sSocket);
//8.终止
WSACleanup();
std::cout << "服务器终止!" << std::endl;
system("pause");
return 0;
}
客户端程序:
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <string>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main() {
cout << "-----客户端-----" << endl;
//1.初始化
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata);
//2.创建套接字
SOCKET cSocket = {};
cSocket = socket(AF_INET, SOCK_STREAM, 0);
if (cSocket == SOCKET_ERROR) {
cout << "客户端套接字创建失败!" << endl;
}
else {
cout << "客户端套接字创建成功!" << endl;
}
//3.绑定套接字
sockaddr_in socketAddr;
socketAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
socketAddr.sin_family = AF_INET;
socketAddr.sin_port = htons(1234);
int cRes = connect(cSocket, (SOCKADDR*)&socketAddr, sizeof(SOCKADDR));
if (cRes == SOCKET_ERROR) {
cout << "客户端连接服务器失败!" << endl;
}
else {
cout << "客户端连接服务器成功!" << endl;
}
while (true) {
string s;
cout << "请输入要发送的数据:" << endl;
getline(cin, s);
int senderr = send(cSocket, (char*)s.c_str(), s.length(), 0);
if (senderr == SOCKET_ERROR) {
cout << "发送错误!" << endl;
break;
}
char recvBuf[2048] = {};
recv(cSocket, recvBuf, 2048, 0);
cout << "客户端接受的数据:" << recvBuf << endl;
}
4.发送请求
//char sendBuf[1024] = "from Client: hello server.";
//send(cSocket, sendBuf, strlen(sendBuf), 0);
5.接收数据
//char recvBuf[1024] = {};
//recv(cSocket, recvBuf, 1024, 0);
//cout << "客户端接收数据:" << recvBuf << endl;
//6.关闭socket
closesocket(cSocket);
//7.终止
WSACleanup();
cout << "客户端退出!" << endl;
system("pause");
return 0;
}
参考文献:
1、https://www.cnblogs.com/yskn/p/9346570.html
2、https://www.csdn.net/gather_28/MtzaAg4sMDctYmxvZwO0O0OO0O0O.html
3、https://wenku.baidu.com/view/413b541d5022aaea988f0f49.html