winsock编程

本文深入探讨了UDP与TCP两种不同类型的网络通信协议,通过具体实例展示了如何在C++中实现服务器端与客户端之间的通信,并介绍了如何使用CSocket类简化网络编程过程。重点讲解了UDP协议的非连接特性及其在网络应用中的优势,同时对比了TCP协议的可靠性和数据传输的稳定性。此外,文章还详细阐述了如何利用CSocket类实现高效的网络通信,包括监听、接受连接、发送与接收数据等功能,为读者提供了一套实用的网络编程解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:UDP

Server端:

#include <WinSock2.h>
#include <iostream>
using namespace std;

void main()
{
	WSAData wsaData;
	WSAStartup(MAKEWORD(2,2),&wsaData);
	SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);
	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	char buf[100];
	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);
	recvfrom(sockSrv,buf,100,0,(SOCKADDR*)&addrClient,&len);
	cout<<buf<<endl;
	sendto(sockSrv,"you are funny",strlen("you are funny")+1,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
	closesocket(sockSrv);
	WSACleanup();
}
Client端:

#include <WinSock2.h>
#include <iostream>
using namespace std;

void main()
{
	WSAData wsaData;
	WSAStartup(MAKEWORD(2,2),&wsaData);
	SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);
	sendto(sockClient,"good boy",strlen("good boy")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	char buf[100];
	int len=sizeof(SOCKADDR);
	recvfrom(sockClient,buf,100,0,(SOCKADDR*)&addrSrv,&len);
	cout<<buf<<endl;
	closesocket(sockClient);
	WSACleanup();
}
二:TCP

Server端

#include <WinSock2.h>
#include <iostream>
using namespace std;

void main()
{
	WSAData wsaData;
	WSAStartup(MAKEWORD(2,2),&wsaData);
	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
	SOCKADDR_IN addr;
	addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	addr.sin_family=AF_INET;
	addr.sin_port=htons(6120);
	bind(sockSrv,(SOCKADDR*)&addr,sizeof(SOCKADDR));
	listen(sockSrv,5);
	while(1)
	{
		SOCKADDR_IN addrClient;
		int len=sizeof(SOCKADDR);
		SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		send(sockConn,"I love you",sizeof("I love you")+1,0);		
		char buf[100];
		recv(sockConn,buf,100,0);
		cout<<buf<<endl;
		closesocket(sockConn);
	}
//	WSACleanup();
}

Client端

#include <WinSock2.h>
#include <iostream>
using namespace std;

void main()
{
	WSAData wsaData;
	WSAStartup(MAKEWORD(2,2),&wsaData);
	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6120);
	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	send(sockClient,"Come on,Baby",strlen("Come on,Baby")+1,0);
	char buf[100];
	recv(sockClient,buf,100,0);
	cout<<buf<<endl;
	closesocket(sockClient);
	WSACleanup();
}

三:CSocket类的使用

Server端:

#include <afxsock.h>
#include <iostream>
using namespace std;
void main()
{	
	//解决断言assert(afxCurrentInstanceHandle != NULL)错误
	HINSTANCE hInstance=(HINSTANCE)GetModuleHandle(NULL);
	afxCurrentInstanceHandle=hInstance;

	AfxSocketInit();
	CSocket sockSrv,sockConn;
	sockSrv.Socket();
	sockSrv.Bind(6000);
	sockSrv.Listen();
	sockSrv.Accept(sockConn);
	char buf[100]={0};
	sockConn.Receive(buf,100);
	cout<<buf<<endl;
	sockSrv.Close();
	sockConn.Close();
}
Client端:

#include <afxsock.h>
#include <iostream>
using namespace std;

void main()
{
	//解决断言assert(afxCurrentInstanceHandle != NULL)错误
	HINSTANCE hInstance=(HINSTANCE)GetModuleHandle(NULL);
	afxCurrentInstanceHandle=hInstance;

	AfxSocketInit();
	CSocket sockClient;
	sockClient.Create();
	sockClient.Connect(L"127.0.0.1",6000);
	sockClient.Send("you are beautiful",strlen("you are beautiful")+1);
	sockClient.Close();
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值