1. 程式人生 > >windows下的網路程式設計實現

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也花了不少時間該,不過動手敲完後確實理解的更加深入)
啟動伺服器端和客戶端
客戶端傳送的字母,傳回大寫字母