windows下的网络编程实现

下面是一个简单的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也花了不少时间该,不过动手敲完后确实理解的更加深入)
启动服务器端和客户端
客户端发送的字母,传回大写字母

猜你喜欢

转载自blog.csdn.net/weixin_42718004/article/details/84963756