c++ Windows Socket实现最简单的C/S网络通信(TCP)

原创 2015年09月18日 12:37:46

1.服务器端代码:

#include<iostream>
#include<WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#define CONNECT_NUM_MAX 10

using namespace std;



int main()
{
	//加载套接字库
	WSADATA wsaData;
	int iRet = 0;
	iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iRet != 0)
	{
		cout << "WSAStartup(MAKEWORD(2, 2), &wsaData) execute failed!" << endl;;
		return -1;
	}
	if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
	{
		WSACleanup();
		cout << "WSADATA version is not correct!" << endl;
		return -1;
	}

	//创建套接字
	SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
	if (serverSocket == INVALID_SOCKET)
	{
		cout << "serverSocket = socket(AF_INET, SOCK_STREAM, 0) execute failed!" << endl;
		return -1;
	}

	//初始化服务器地址族变量
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);

	//绑定
	iRet = bind(serverSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
	if (iRet == SOCKET_ERROR)
	{
		cout << "bind(serverSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) execute failed!" << endl;
		return -1;
	}


	//监听
	iRet = listen(serverSocket, CONNECT_NUM_MAX);
	if (iRet == SOCKET_ERROR)
	{
		cout << "listen(serverSocket, 10) execute failed!" << endl;
		return -1;
	}

	//等待连接_接收_发送
	SOCKADDR_IN clientAddr;
	int len = sizeof(SOCKADDR);
	while (1)
	{
		SOCKET connSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &len);
		if (connSocket == INVALID_SOCKET)
		{
			cout << "accept(serverSocket, (SOCKADDR*)&clientAddr, &len) execute failed!" << endl;
			return -1;
		}

		char sendBuf[100];
		sprintf_s(sendBuf, "Welcome %s", inet_ntoa(clientAddr.sin_addr));
		send(connSocket, sendBuf, strlen(sendBuf)+1, 0);

		char recvBuf[100];
		recv(connSocket, recvBuf, 100, 0);
		printf("%s\n", recvBuf);
		closesocket(connSocket);
	}
	
	system("pause");
	return 0;
}


2.客户端代码:

#include<iostream>
#include <winsock2.h>
using namespace std;

#pragma comment(lib, "ws2_32.lib")
int main()
{
	//加载套接字库
	WSADATA wsaData;
	int iRet =0;
	iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iRet != 0)
	{
		cout << "WSAStartup(MAKEWORD(2, 2), &wsaData) execute failed!" << endl;
		return -1;
	}
	if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
	{
		WSACleanup();
		cout << "WSADATA version is not correct!" << endl;
		return -1;
	}

	//创建套接字
	SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
	if (clientSocket == INVALID_SOCKET)
	{
		cout << "clientSocket = socket(AF_INET, SOCK_STREAM, 0) execute failed!" << endl;
		return -1;
	}

	//初始化服务器端地址族变量
	SOCKADDR_IN srvAddr;
	srvAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	srvAddr.sin_family = AF_INET;
	srvAddr.sin_port = htons(6000);

	//连接服务器
	iRet = connect(clientSocket, (SOCKADDR*)&srvAddr, sizeof(SOCKADDR));
	if (0 != iRet)
	{
		cout << "connect(clientSocket, (SOCKADDR*)&srvAddr, sizeof(SOCKADDR)) execute failed!" << endl;
		return -1;
	}

	//接收消息
	char recvBuf[100];
	recv(clientSocket, recvBuf, 100, 0);
	printf("%s\n", recvBuf);

	//发送消息
	char sendBuf[100];
	sprintf_s(sendBuf, "Hello, This is client %s", "兔子");
	send(clientSocket, sendBuf, strlen(sendBuf)+1, 0);

	//清理
	closesocket(clientSocket);
	WSACleanup();
	
	system("pause");
	return 0;
}

3.程序运行截图:



C/S模式的socket套接字编程例子

客户端:using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using S...
  • xiao_jun_0820
  • xiao_jun_0820
  • 2007年09月26日 11:31
  • 2522

Socket原理及C/S简单代码实现

转载自:http://blog.csdn.net/ljianhui/article/details/10477427 ——————————————————————————————————————...
  • u012398362
  • u012398362
  • 2015年05月04日 16:17
  • 1305

C++基础--完善Socket C/S ,实现客户端,服务器端断开重连

原文地址::http://www.cnblogs.com/kingdom_0/articles/2571727.html 相关文章 1、socket连接,判断连接中断,如果中断,并自动重连...
  • goluck
  • goluck
  • 2018年01月10日 14:03
  • 1257

C++基于TCP/IP简单的客户端、服务器通信程序实例

本篇文章实现了一个基于TCP 的
  • shenjie12345678
  • shenjie12345678
  • 2014年06月08日 21:45
  • 72771

C++ Socket网络通信实现一个服务器端和多个客户端的通信

一 描述 1 采用C++语言 2 编译环境是code::blocks 3 使用的是非阻塞套接字 二 功能描述 1 一个服务器对多个客户端 2 服务器端主要负责处理数据的输入并发送,具体是通过发送指令...
  • u011599639
  • u011599639
  • 2017年04月06日 10:59
  • 6257

C++网络通信库性能大比拼

C/C++网络通信库有不少,本次benchmark的目的是为了公平的评估它们的网络I/O性能,当然是作为REST server, 因此每个server都写了一些代码,好在不是特别复杂。这个测试经过了好...
  • sheismylife
  • sheismylife
  • 2015年10月20日 22:27
  • 9303

C/S架构的C++实现

  • 2009年12月14日 17:22
  • 4.49MB
  • 下载

Visual C++(MFC)实现C/S

C/S源码见日志文尾 此软件只是一个简单的局域网聊天工具(实现了简单的聊天功能)!开发工具:VC++ 6.0 开发环境:Win 10 Windows 编程(基于C++语言...
  • qq_20938879
  • qq_20938879
  • 2016年04月01日 12:35
  • 1250

C++中的TCP通信

TCP通信服务端和客户端代码是不同的。首先,服务端有一个ServerSocket,初始化以后(包括设置IP和端口,绑定监听等过程),这些都设置好以后,就可以使用accept()方法等待客户端连接了,这...
  • zahngjialiang
  • zahngjialiang
  • 2016年12月29日 16:17
  • 2373

linux下C++实现TCP通信

UDP教程可以查看:http://blog.csdn.net/weixin_37895339/article/details/72780080 TCP通信协议连结过程如下图所示。 由上图可看出...
  • weixin_37895339
  • weixin_37895339
  • 2017年05月30日 15:48
  • 792
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++ Windows Socket实现最简单的C/S网络通信(TCP)
举报原因:
原因补充:

(最多只允许输入30个字)