C语言 Windows网络编程基础

#1、Winodws服务端
服务端编程主要由下面几个步骤组成,
1、初始化套接字库
2、创建套接字
3、配置本机地址信息
4、绑定套接字
5、进行监听
6、接受请求
7、传输数据
源代码如下:



#include <iostream>
#include <WinSock2.h>


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


#define SERVER_PORT  8000

int main()
{
	//1、 初始化套接字库
	WSADATA wsaDate;
	WORD wVersion = MAKEWORD(1, 1);    //选择版本
	int err;
	err = WSAStartup(wVersion, &wsaDate);
	if (err != 0)
	{
		return -1;
	}
	if (LOBYTE(wsaDate.wVersion) != 1 || HIBYTE(wsaDate.wVersion) != 1)
	{
		WSACleanup();
		return -1;
	}

	// 2、创建套接字   
	SOCKET serverSock = socket(AF_INET, SOCK_STREAM, 0);
	// 3、配置主机信息
	SOCKADDR_IN serverAddr;
	/***************************************
     *第一句代码:配置本机IP地址 htonl函数的意思是 host to network long  将主机字节序转换为网络字节序
     *  由于网络数据传输采用的是大端存储方式,而X86系列机器采用的是小端存储方式
     *第三句:配置端口号,端口号是由自己指定的
     **************************************/
	serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(SERVER_PORT);

	// 4、绑定到主机
	bind(serverSock, (SOCKADDR *)&serverAddr, sizeof(SOCKADDR));

	// 5、监听
	listen(serverSock, 128);

	std::cout << "等待客户连接...\n";
	//创建套接字来保存连入的客户机的IP地址及端口号信息
	SOCKADDR_IN clientAddr;
	SOCKET clientSock;
	char revBuf[128];
	char sedBuf[128];
	int len = sizeof(SOCKADDR);
	sprintf_s(sedBuf, 128, "Hello,my server?");
	// 6、接受请求
	while (true)
	{
		//接受客户socket
		clientSock = accept(serverSock, (SOCKADDR *)&clientAddr, &len);
		// 7、传输数据
		//接收数据
		recv(clientSock, revBuf, sizeof(revBuf), 0);
		//发送数据
		std::cout << "received:" << revBuf << '\n';

		std::cout << "send message:" << sedBuf << '\n';
		send(clientSock, sedBuf, strlen(sedBuf)+1, 0);

        //关闭套接字
		closesocket(clientSock);

	}
    //关闭服务端套接字
	closesocket(serverSock);
	//清理套接字库
	WSACleanup();

	system("pause");
	return 0;
}

#2、Windows客户端
Windows客户端比服务端简单一些,步骤如下:
1、初始化套接字库
2、创建套接字
3、配置IP地址及端口号信息
4、发送请求连接服务端
5、传输数据
源代码如下:


#include <iostream>
#include <WinSock2.h>

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

#define CLIENT_ADDR  "127.0.0.1"  //127.0.0.1 表示本机IP地址 此处为服务端IP地址
                                  //,如果服务端和客户端在同一电脑上 使用127.0.0.1就可以
#define CLIENT_PORT  8000

int main()
{
	WSADATA wsaDate;
	WORD wVersion = MAKEWORD(1, 1);
	int err;
	err = WSAStartup(wVersion, &wsaDate);
	if (err != 0)
	{
		return -1;
	}
	if (LOBYTE(wsaDate.wVersion) != 1 || HIBYTE(wsaDate.wVersion) != 1)
	{
		WSACleanup();
		return -1;
	}

	SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0);
	// 服务器的地址以及端口号信息
	SOCKADDR_IN serverAddr;
	serverAddr.sin_family = AF_INET;
	// inet_addr 的作用是将字符串转换为地址
	serverAddr.sin_addr.S_un.S_addr = inet_addr(CLIENT_ADDR);
	serverAddr.sin_port = htons(CLIENT_PORT);

	//连接到服务器
	connect(clientSock, (SOCKADDR *)&serverAddr, sizeof(SOCKADDR));

	char sedBuf[128] = "Hello,my client";
	char revBuf[128];

	send(clientSock, sedBuf, strlen(sedBuf)+1, 0);
	std::cout << "send: " << sedBuf << '\n';

	recv(clientSock, revBuf, sizeof(revBuf), 0);
	std::cout << "received: " << revBuf << '\n';

	closesocket(clientSock);
	WSACleanup();
	system("pause");
	return 0;
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值