项目实战Small example:C:Socket之Tcp编程 [控制台程序]

版权声明:欢迎转载,但是亲请注明转载原文地址,谢谢,么么哒 https://blog.csdn.net/qq_33154343/article/details/81808722

项目实战Small example:C:Socket之Tcp编程 [控制台程序]

==================================================================

编辑环境:win10_x64 /VS2015

项目名称:C:Small example:C:Socket之Tcp编程 [控制台程序]

项目简介:Socket的TCP编程,在这里运行了一个win32控制台的程序,一个服务器,一个客户端之间的通信,对socket编程的一个加深入门理解,(之前也在Qt5,使用widget(在该系列文章中)编程了一个带UI的聊天小程序的)。

项目功能:只能够单方面的又服务器向着发送消息,客户端向服务端发送消息。可以发送多个消息并且将其显示出来。

其他:如果有知道,知道如何客户端向服务端发送消息,修改我里面的两个while(true){}里面的send和recv的,欢迎在下面留言,

==================================================================

项目运行效果:

==================================================================

项目思路分析:

==================================================================

项目不足之处:

没有对服务器对客户端之间发送消息,也没有使用到多线程,每次使用一个while(1){}来循环监测,看看有没有新的客户机进行连接,有的话们就创建一个新的线程,让他们之间能够进行通信,类似群聊一样。将会在后续学习的socket之中对这两个进行生深入地学习。其中,并发服务器的思路如下图:

==================================================================

项目主要源码:

服务器端:

// tcp_server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#pragma comment(lib, "WS2_32")


int main()
{
	system("title TCP服务器");

	//检查协议栈是否可使用
	WSADATA wsaData;
	if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
	{
		printf("error:  WSAStartup() faile...\n");
		return -1;
	}

	printf("服务器已经启动...\n");

	//创建服务器端的套接字
	SOCKET SockServer = socket(AF_INET, SOCK_STREAM, 0);

	//建立服务器端的地址
	SOCKADDR_IN addrSrever;
	addrSrever.sin_family = AF_INET;
	addrSrever.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrever.sin_port = htons(2000);

	//绑定套接字
	if (SOCKET_ERROR == bind(SockServer, (SOCKADDR *)&addrSrever, sizeof(SOCKADDR)))
	{
		printf("error:  bind() faile...:%d\n", WSAGetLastError());
		return -1;
	}

	//监听
	if (SOCKET_ERROR == listen(SockServer, 5))
	{
		printf("error:  listen() faile...:%d\n", WSAGetLastError());
		return -1;
	}
	printf("服务器监听中...\n");
	
	//初始化客户地址长度参数
	int len = sizeof(SOCKADDR);
	SOCKADDR_IN addrClient;
	char szSendBuf[2048] = "已经连接服务器成功";
	char szRecvBuf[2048] = "";

	//等待客户的连接请求,接收请求连接
	SOCKET sockAccept = accept(SockServer, (SOCKADDR *)&addrClient, &len);
	if (INVALID_SOCKET == sockAccept)
	{
		printf("error:  accept() faile...:%d\n", WSAGetLastError());
		return -1;
	}

	//输出连接成功的客户IP和端口号
	printf("Accepted client IP:[%s], prot:[%d]\n", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port));

	//进入一个无限循环,
	while (true)
	{

	    recv(sockAccept, szRecvBuf, sizeof(szRecvBuf), 0);
	    printf("客户端:%s \n", szRecvBuf);
	    /*printf(">>");
	    scanf("%s", szSendBuf);
	    send(SockServer, szSendBuf, strlen(szSendBuf) + 1, 0);*/

	}
	
	//关闭套接字
	closesocket(SockServer);
	//关闭协议栈的检查
	WSACleanup();


    return 0;
}

客户端:

// tcp_client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#pragma comment(lib, "WS2_32")


int main()
{
	system("title TCP客户端");

	//检查协议栈是否可使用
	WSADATA wsaData;
	if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
	{
		printf("error:  WSAStartup() faile...\n");
		return -1;
	}

	//创建客户端的套接字
	SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
	if(INVALID_SOCKET == sockClient)
	{
		printf("error:  socket() faile...:%d\n", WSAGetLastError());
		return -1;
	}

	SOCKADDR_IN addrServer;
	addrServer.sin_family = AF_INET;
	char szInIP[30] = "";
	printf("请输入对方IP地址(同局域网):eg:127.0.0.1\nIP>>");
	scanf("%s", szInIP);
	addrServer.sin_addr.S_un.S_addr = inet_addr(szInIP);
	addrServer.sin_port = htons(2000);

	//请求与服务器建立TCP连接
	if (INVALID_SOCKET == connect(sockClient, (SOCKADDR *)&addrServer, sizeof(SOCKADDR)))
	{
		printf("error:  connect() faile...:%d\n", WSAGetLastError());
		return -1;
	}
		

	char szRecvBuf[2048] = "";
	char szSendBuf[2048] = "客户端已经连接成功";


	while (true)
	{
		printf(">>");
		scanf("%s", szSendBuf);
		send(sockClient, szSendBuf, strlen(szSendBuf) + 1, 0);
		/*recv(sockClient, szRecvBuf, sizeof(szRecvBuf), 0);
		printf("客户端:%s \n", szRecvBuf);*/

	}




	

	closesocket(sockClient);


	WSACleanup();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_33154343/article/details/81808722