C++网络编程原理及实现

WINSOCK介绍
Winsock是一个基于Socket模型的API,在Windows系统中广泛使用。
它在Berkeley接口函数的基础上,还增加了基于消息驱动机制的Windows扩展函数。
Winsock1.1只支持TCP/IP网络,Winsock2.2增加了对更多协议的支持。
包含的头文件
Winsock2.h
导入库ws2_32.lib
#pragma comment(lib,”ws2_32.lib”);
可以打开工程属性页,配置属性->链接器->输入->附加依赖项中加入ws2_32.lib
以上两种方法任选其一
l 网络连接函数
socket 创建套接字
bind 绑定本机端口
listen 监听端口
accept 接受连接
connect 建立连接
recv, recvfrom 数据接收
send,sendto 数据发送
客户端代码实现
#include <winSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define MYPORT 6666
#define MYADDR "192.168.1.23"

int main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD(2,2);

	if(WSAStartup(wVersionRequested,&wsaData) != 0)
	{
		return 1;
	}
	if(wsaData.wVersion != wVersionRequested)
	{
		WSACleanup();
		return 1;
	}
	SOCKET socketfd;
	SOCKET clientfd;

	socketfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(socketfd == INVALID_SOCKET)
	{
		cout<<"create error";
		return -1;
	}
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	memset(&server_addr,0,sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(MYPORT);
	server_addr.sin_addr.s_addr = inet_addr(MYADDR);
	int ret;
	ret = connect(socketfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
	if(ret == -1)
	{
		cout<<"connect error";
		return -1;
	}
	cout<<"connect sucessfully...\n";
		
	int writecnt = 0;
	char writebuff[20];
	while(1)
	{
		cin>>writebuff;
		writecnt = send(socketfd,writebuff,sizeof(writebuff),0);
		if(writecnt == -1)
		{
			cerr<<"write error"<<endl;
		}
		if(strcmp(writebuff,"end") == 0)
		{
			break;
		}
		cout<<writebuff<<endl;
		memset(writebuff,0,20);
	}
	system("pause");
	closesocket(socketfd);
	return 0;
}
服务器代码实现
#include <winSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define MYPORT 6666
#define MYADDR "192.168.1.23"

int main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD(2,2);

	if(WSAStartup(wVersionRequested,&wsaData) != 0)
	{
		return 1;
	}
	if(wsaData.wVersion != wVersionRequested)
	{
		WSACleanup();
		return 1;
	}
	SOCKET socketfd;
	int len;
	socketfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(socketfd == INVALID_SOCKET)
	{
		cout<<"create error";
		return -1;
	}
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	memset(&server_addr,0,sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(MYPORT);
	server_addr.sin_addr.s_addr = inet_addr(MYADDR);
	int opt = 1;
	int ret;
	ret = setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt));
	if (ret == SOCKET_ERROR)
	{
		cout<<"error with code = "<<WSAGetLastError()<<endl;
		exit(1);
	}
	cout<<"socket successfully"<<endl;
	
	ret = bind(socketfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
	if(ret == -1)
	{
		cout<<"bind error"<<endl;
		return -1;
	}
	cout<<"bind sucessfully...\n";

	ret = listen(socketfd,10);
	if(ret == -1)
	{
		cout<<"listen error"<<endl;
		return -1;
	}
	cout<<"listen sucessfully...\n";

	int clientfd = 0;
	len = sizeof(server_addr);
	clientfd = accept(socketfd,(struct sockaddr *)&client_addr,&len);
	if(clientfd == INVALID_SOCKET)
	{
		cout<<"accept error"<<endl;
		return -1;
	}
	cout<<"accept sucessully...\n";
	cout<<inet_ntoa(client_addr.sin_addr)<<" "<<ntohs(client_addr.sin_port)<<endl;

	int recvcnt = 0;
	char recvbuff[20];
	while(1)
	{
		recvcnt = recv(clientfd,recvbuff,sizeof(recvbuff),0);

		if(recvcnt == SOCKET_ERROR)
		{
			cerr<<"read error"<<endl;
			break;
		}
		if(recvcnt == 0)
		{
			cout<<"client close"<<endl;
			break;
		}
		cout<<recvbuff<<endl;
		if(strcmp(recvbuff,"end") == 0)
		{
			break;
		}
		memset(recvbuff,0,20);
	}
	closesocket(clientfd);
	closesocket(socketfd);
	return 0;
}




¡closesocket,shutdown 关闭套接字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值