下面是一个简单的windows下的服务端和客户端的实现代码需要注意的是
1、此编程实现的只是最简单的网络通信,不支持多进程和多线程的并发(网上找到很多过于多进程和多线程并发的服务器端设计,不过都是在linux下的,在windows下的创建进程和线程的函数不熟悉,也没怎么看懂,后期继续学习)
2、获取到来自客户端的数据后,服务器端将数据改成大写传回客户端
3、测试只需要同时打开服务器端和客户端的.exe文件即可
服务器端:
#include <stdio.h>
#include "winsock2.h"
#include <algorithm>
#include <iostream>
#pragma comment(lib,"WS2_32")
void main()
{
std::cout << "启动server端........." << std::endl;
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
// Create a socket.
SOCKET m_socket;
m_socket = socket(AF_INET, SOCK_STREAM, 0);
if (m_socket == INVALID_SOCKET)
{
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
}
// Bind the socket.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);
if (bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
{
printf("bind() failed.\n");
closesocket(m_socket);
return;
}
// Listen on the socket.
if (listen(m_socket, 1) == SOCKET_ERROR)
printf("Error listening on socket.\n");
// Accept connections.
SOCKET AcceptSocket;
printf("Waiting for a client to connect...\n");
AcceptSocket = SOCKET_ERROR;
while (AcceptSocket == SOCKET_ERROR)
{
AcceptSocket = accept(m_socket, NULL, NULL);
}
printf("Client Connected.\n");
//m_socket = AcceptSocket;
int SentLen;
int RecvLen = SOCKET_ERROR;
char sendbuf[32];
// Send and receive data.
int i = 0;
while (1)
{
i = 0;
char recvbuf[32];
RecvLen = recv(AcceptSocket, recvbuf, strlen(recvbuf), 0);
for (i = 0; i < RecvLen; i++)
{
sendbuf[i] = toupper(recvbuf[i]);
}
SentLen = send(AcceptSocket, sendbuf, RecvLen , 0);
if (SentLen > 0)
std::cout << "成功回送客户端\t" << SentLen << "数据" << std::endl;
}
closesocket(AcceptSocket);
closesocket(m_socket);
system("pause");
return;
}
客户端:
#include <stdio.h>
#include "winsock2.h"
#include <iostream>
#pragma comment(lib,"WS2_32")
void main()
{
std::cout << "启动client端........." << std::endl;
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
// Create a socket.
SOCKET m_socket;
m_socket = socket(AF_INET, SOCK_STREAM, 0);
if (m_socket == INVALID_SOCKET)
{
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
}
// Connect to a server.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
clientService.sin_port = htons(27015);
if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
printf("Failed to connect.\n");
WSACleanup();
return;
}
// Send and receive data.
int SentLen;
int RecvLen = SOCKET_ERROR;
char recvbuf[32];
while (1)
{
char sendbuf[32];
std::cin >> sendbuf;
//std::cout <<"strlen(sendbuf):"<< strlen(sendbuf) << std::endl;
//std::cout <<"sizeof(sendbuf):"<< sizeof(sendbuf) << std::endl;
SentLen = send(m_socket, sendbuf, strlen(sendbuf), 0);
printf("SendLen: %ld\n", SentLen);
RecvLen = recv(m_socket, recvbuf, SentLen, 0);
if (RecvLen == 0 || RecvLen == WSAECONNRESET)
{
printf("Connection Closed.\n");
break;
}
if (RecvLen < 0)
return;
int i = 0;
while (i < RecvLen)
{
std::cout << recvbuf[i++];
}
std::cout << std::endl;
}
closesocket(m_socket);
return;
}
另外简单附上测试图片(小小的BUG也花了不少时间该,不过动手敲完后确实理解的更加深入)