TCP Sever Client 面向连接的实现

下面的笔记本和代码是我在看 达内的视频教程时, 跟着视频敲下来的, 对于网络编程初学者来说, 是很好的入门教程.

面向连接实现

在Windows下, 使用Socket编程, 首先初始化Socket库, 然后才能分别做服务端和客户端程序
当前库的版本: 2.2
WSAStartup 用于初始化Socket库的API
int WSAStartup(
 __in          WORD wVersionRequested, // 版本号
 __out         LPWSADATA lpWSAData // 获取Socket的信息
);
动态库: WS2_32.dll
LIB: WS2_32.lib
头文件: windows.h




1. 服务器
1. 创建Socket
SOCKET socksvr = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2. 绑定端口和IP
bind函数, 需要指定绑定的IP和端口, 
如果需要绑定本机所有IP, 将IP地址设为 INADDR_ANY;
3. 侦听
listen函数
4. 接收
accept函数 阻塞函数, 等候客户端的连接, 并返回连接好的socket
5. 数据收发
recv/send 默认情况下是阻塞函数
6. 关闭Socket
clossocket函数
2. 客户端
1. 创建Socket
SOCKET socksvr = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2. 连接服务器
connect函数, 需要指定连接服务器的IP地址和端口
3. 数据收发
recv/send 默认情况下是阻塞函数
4. 关闭Socket

clossocket函数

以下代码为服务端的代码, VS控制台工程

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

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")

int TCPServer()
{
	struct sockaddr_in svraddr;// = {0};
	svraddr.sin_family = AF_INET;
	svraddr.sin_port = htons(5678);
	svraddr.sin_addr.S_un.S_addr = htons((INADDR_ANY));// 当前电脑任一IP
	// 创建一个socket
	SOCKET socksvr = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	
	if (socksvr == INVALID_SOCKET)
	{
		printf("创建Socket失败!\n");
		return -1;
	}
	// 绑定IP和端口

	bind(socksvr, (struct sockaddr *)&svraddr, sizeof(svraddr));

	// 侦听, CMD 中 用netstat -an 可以看到当前的5678端口处于侦听状态
	listen(socksvr, SOMAXCONN);

	printf("等待客户端...\n");	
	// 等待客户端
	struct sockaddr_in clientaddr = {0};
	int nLen = sizeof(clientaddr);
	SOCKET sockclient = accept(socksvr,
		(struct sockaddr *)&clientaddr,
		&nLen);
	printf("客户端已连接.\n");

	// 数据收发
	CHAR szText[100] = {0};
	recv(sockclient, szText, 100, 0);
	printf("%s\n", szText);
	CHAR szSend[100] = "Hello Client";
	send(sockclient, szSend, sizeof(szSend), 0);

	getchar();	// 暂停看现象
	// 关闭
	closesocket(sockclient);
	closesocket(socksvr);

	return 0;
}





int _tmain(int argc, _TCHAR* argv[])
{
	// 初始化Socket库
	WSADATA wsa = {0};
	WSAStartup(MAKEWORD(2,2), &wsa);
	// TCP 服务端
	TCPServer();

	return 0;
}

以下代码是客户端代码, VS控制台工程

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

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")

int TCPClient()
{
	struct sockaddr_in addr;// = {0};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(5678);
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");	// 本机IP地址

	// 创建一个socket
	SOCKET sockclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	
	if (sockclient == INVALID_SOCKET)
	{
		printf("创建Socket失败!\n");
		return -1;
	}

	// 连接服务器

	connect(sockclient, (struct sockaddr *)&addr, sizeof(addr));

	// 数据收发
	CHAR szSend[100] = "Hello Sever";
	send(sockclient, szSend, sizeof(szSend), 0);
	CHAR szRecv[100] = {0};
	recv(sockclient, szRecv, 100, 0);
	printf("%s\n", szRecv);
	
	getchar();	
	// 关闭Socket
	closesocket(sockclient);

	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	// 初始化Socket库
	WSADATA wsa = {0};
	WSAStartup(MAKEWORD(2,2), &wsa);
	// TCP 客户端

	TCPClient();

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值