C语言:网络通信 - TCP简单通信Dome

服务端:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock.h> //网络通信


#pragma comment(lib,"ws2_32.lib")



void main()
{
	char sendbuf[256] = { 0 };//发送消息
	char receivebuf[256] = { 0 };//接受消息

	//发送和接受数据的长度
	int sendLength = 0;
	int recevieLength = 0;

	int length = 0; //SOCKADDR : 地址长度

	SOCKET socket_server; //服务端套接字
	SOCKET socket_receive;//连接的套接字

	/*
	 SOCKADDR_IN 和 SOCKADDR 两个结构体,不要搞混
	*/
	SOCKADDR_IN server_addr;//服务起地址
	SOCKADDR_IN client_addr;//客户端地址

	WORD wversion = MAKEWORD(2, 2);//版本 :2.2
	WSADATA wsadata; //版本
	int error = WSAStartup(wversion, &wsadata);//获取版本进行对比,开始通信
	if (error != 0)
	{
		printf("ERROE!");
		return;
	}
	//取出低8位,高8位进行对比
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
	{
		printf("Version error!");
		return;
	}

	//设置连接地址
	server_addr.sin_family = AF_INET;//通信
	server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//获取本地地址
	server_addr.sin_port = htons(9983);//设置端口

	//创建套接字接受消息
	socket_server = socket(AF_INET, SOCK_STREAM, 0); //创建 SOCK_STREAM (流式通信)

	//绑定端口
	bind(socket_server, (SOCKADDR*)&server_addr,sizeof(SOCKADDR));

	//建通
	listen(socket_server, 5); //设置监听5个客户端

	length = sizeof(SOCKADDR);

	//接受连接
	socket_receive = accept(socket_server, (SOCKADDR*)&client_addr, &length);


	while (1)
	{
		//接受消息:
		recevieLength = recv(socket_receive, receivebuf, 256, 0);
		printf("接受到客户端:%s\n", receivebuf);
		memset(receivebuf, 0, 256);

		//发送消息
		printf("请输入服务端返回发送数据:\n");
		scanf("%s", &sendbuf);
		sendLength = send(socket_receive, sendbuf, 256, 0);
		memset(sendbuf, 0, 256);
	}

	//释放网络
	closesocket(socket_server);
	closesocket(socket_receive);
	WSACleanup(); //清理资源

	system("pause");
}

客户端:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock.h> //网络通信

#pragma comment(lib,"ws2_32.lib")

void main()
{
	char sendbuf[256] = { 0 };//发送消息
	char receivebuf[256] = { 0 };//接受消息

	//发送和接受数据的长度
	int sendLength = 0;
	int recevieLength = 0;

	

	SOCKET socket_send; //服务端套接字
	SOCKADDR_IN server_addr;//服务起地址
	

	WORD wversion = MAKEWORD(2, 2);//版本 :2.2
	WSADATA wsadata; //版本
	int error = WSAStartup(wversion, &wsadata);//获取版本进行对比,开始通信
	if (error != 0)
	{
		printf("ERROE!");
		return;
	}
	//取出低8位,高8位进行对比
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
	{
		printf("Version error!");
		return;
	}

	//设置连接地址
	server_addr.sin_family = AF_INET;//通信
	server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//htonl(INADDR_ANY);//获取本地地址
	server_addr.sin_port = htons(9983);//设置端口

	//连接地址:设定发送的相关信息
	socket_send = socket(AF_INET, SOCK_STREAM, 0); //流式传输

	connect(socket_send, (SOCKADDR*)&server_addr, sizeof(SOCKADDR));//连接

	while (1)
	{
		//发送
		printf("请输入发送的信息:\n");
		scanf("%s", sendbuf);
		sendLength = send(socket_send, sendbuf, 256, 0);
		memset(sendbuf, 0, 256);

		//接受
		recevieLength = recv(socket_send, receivebuf, 256, 0);
		printf("接受到服务端信息 %s:\n", receivebuf);
		memset(receivebuf, 0, 256);
	}



	closesocket(socket_send);
	WSACleanup(); //清理资源

	system("pause");
}


在这里插入图片描述

TCP多线程 一对多接受与发送

服务端
#define  _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS 0 //使用就函数套接字
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock2.h> //网络通信
#include <Ws2tcpip.h>

#pragma comment(lib,"ws2_32.lib")
#define MSGLEN 256
#define PORT 8899
#define IP_ADDR "127.0.0.1"

//创建连接线程
DWORD WINAPI client_thread(void* vptr);


void main()
{
	WSADATA wsadata; //通信报文结构体-版本
	SOCKET client;//客户端
	SOCKET server;//服务端
	SOCKADDR_IN client_addr ,locale_addr;//客户端 ,服务端地址
	int addrLength = 0;
	HANDLE hthread = NULL;//线程句柄
	int result = 0;//结果标识
	char sendbuf[MSGLEN] = { 0 };//消息


	int error = WSAStartup(MAKEWORD(2, 2), &wsadata);//获取版本进行对比,开始通信
	if (error != 0)
	{
		printf("ERROE!\n");
		return;
	}
	
	server = socket(AF_INET, SOCK_STREAM, 0);//初始化服务端通信
	if (server == INVALID_SOCKET)
	{
		printf("The server failed to initialize!\n");
		return;
	}

	locale_addr.sin_family = AF_INET;
	locale_addr.sin_addr.s_addr = inet_addr(IP_ADDR);
	locale_addr.sin_port = htons(PORT);
	memset(locale_addr.sin_zero, 0x00, 8);

	result = bind(server, (struct sockaddr*)&locale_addr, sizeof(locale_addr)); //绑定端口

	if (result != 0)
	{
		printf("绑定端口失败!\n");
		return;
	}

	result = listen(server, 5); //监听服务
	if (result != 0)
	{
		printf("监听端口失败!\n");
		return;
	}

	puts("服务起启动成功!");

	while (1)
	{
		addrLength = sizeof(client_addr);
		client = accept(server, (struct sockaddr*)&client_addr, &addrLength);
		if (client == INVALID_SOCKET)
		{
			puts("接受失败!");
			return;
		}

		printf("连接客户端:【IP】=%s ,【Port】=%d \n", inet_ntoa(client_addr.sin_addr), client_addr.sin_port);
		hthread = CreateThread(NULL, 0, client_thread, (void*)client, 0, NULL);


		//WaitForSingleObject(hthread, INFINITE);
	}

	closesocket(server);
	closesocket(client);
	WSACleanup(); //清理资源

	system("pause");

}


DWORD WINAPI client_thread(void* vptr)
{
	SOCKET client = (SOCKET)vptr;
	int res = 0;
	char recevicebuf[MSGLEN] = { 0 };
	char sendbuf[MSGLEN] = { 0 };
	while (1)
	{
		memset(recevicebuf, 0, MSGLEN);
		memset(sendbuf, 0, MSGLEN);
		res = recv(client, recevicebuf, MSGLEN, 0);
		if (res == SOCKET_ERROR)
		{
			printf("Message acceptance failure!\n");
			break;
		}
		else
		{
			printf("接受到:%s\n", recevicebuf);
		}

		//返回一条信息
		
		sprintf(sendbuf, "接受到信息:%s\n", recevicebuf);
		res = send(client, sendbuf, strlen(sendbuf), 0);
	}
	return 0;
}
客户端
#define  _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS 0 //使用就函数套接字
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock2.h> //网络通信
#include <Ws2tcpip.h>

#pragma comment(lib,"ws2_32.lib")
#define MSGLEN 256
#define PORT 8899
#define IP_ADDR "127.0.0.1"



void main()
{
	WSADATA wsadata; //通信报文结构体-版本
	SOCKET client;//客户端
	SOCKADDR_IN server_addr;//服务端地址
	int addrLength = 0;
	HANDLE hthread = NULL;//线程句柄
	int result = 0;//结果标识
	char sendbuf[MSGLEN] = { 0 };//消息


	int error = WSAStartup(MAKEWORD(2, 2), &wsadata);//获取版本进行对比,开始通信
	if (error != 0)
	{
		printf("ERROE!\n");
		return;
	}
	


	client = socket(AF_INET, SOCK_STREAM, 0);//创建客户端
	if (client == INVALID_SOCKET)
	{
		printf("client create error!\n");
		return;
	}

	//设置服务起地址信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr(IP_ADDR);//旧版函数
	server_addr.sin_port = htons(PORT);
	memset(server_addr.sin_zero, 0x00, 8);//清空

	//连接:
	result = connect(client, (SOCKADDR_IN*)&server_addr, sizeof(server_addr));
	if (result != 0)
	{
		printf("The connection to the server failed!\n");
		return;
	}

	char recevicebuf[MSGLEN] = { 0 };
	while (1)
	{
		memset(recevicebuf, MSGLEN, 0);
		puts("请输入要发送的消息:");
		scanf("%s", sendbuf);
		result = send(client, sendbuf, strlen(sendbuf), 0);
		if (result == SOCKET_ERROR)
		{
			printf("Message delivery failed!\n");
		}
		memset(sendbuf, MSGLEN, 0);

		result = recv(client, recevicebuf, MSGLEN, 0);
		if (result == SOCKET_ERROR)
		{
			printf("接受服务端信息失败!\n");
		}

		printf("%s", recevicebuf);
	}

	closesocket(client);
	WSACleanup(); //清理资源

	system("pause");
}

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值