Windows网络编程(TCP/UDP)

一、套接字类型

1、流式套接字(SOCK_STREAM)TCP

2、数据报式套接字(SOCK_DGRAM)UDP

3、原始套接字(SOCK_RAM)

二、通信过程

TCP方式:

服务器端:

1、创建套接字(socket)

2、将套接字绑定到一个本地地址和端口上(bind)

3、将套接字设为监听模式,准备接收客户请求(listen)

4、等待客户请求到来:当请求到来后,接收连接请求,返回一个新的对应此次连接的套接字(accept)

5、用返回的套接字和客户端进行通信(send/recv)

6、返回,等待另一客户请求

7、关闭套接字

客户端:

1、创建套接字(socket)

2、向服务器发出连接请求(connect)

3、和服务器端进行通信(send/recv)

4、关闭套接字

UDP方式:

服务器端:

1、创建套接字(socket)

2、将套接字绑定到一个本地地址和端口上(bind)

3、等待接收数据(recvfrom)

4、关闭套接字

客户端:

1、创建套接字(socket)

2、向服务器端发送数据(sendto)

3、关闭套接字

三、具体实现

TCP方式:

Φ获取套接字库,所有方式必须!

Server:

WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD(1, 1);  //版本1.1
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0) 
	{
		printf("WSAStartup failed with error: %d\n", err);
		return 1;
	}
	//低字节,高字节
	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) !=1) 
	{
		printf("Could not find a usable version of Winsock.dll\n");
		WSACleanup();
	}
	else
		printf("The Winsock 1.1 dll was found okay\n");

//创建服务器套接字
	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
//地址结构体
	SOCKADDR_IN addrSrv;

	//htonl 转为网络字节序(设置地址为任意)
	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	addrSrv.sin_family=AF_INET;

	//htons usigned int转为网络字节序,设置端口
	addrSrv.sin_port=htons(6000);

	//绑定
	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

	//监听客户端请求,最大并发数为5
	listen(sockSrv,5);

        //获取客户端IP
	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);
	//服务器 死循环
	while(1)
	{
		SOCKET sockCon=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		char buff[100];
		sprintf(buff,"tanhp.com",inet_ntoa(addrClient.sin_addr));
		//发送数据
		send(sockCon,buff,strlen(buff)+1,0);
		//接收数据
		recv(sockCon,buff,100,0);
		printf("%s\n",buff);
		closesocket(sockCon);
	}

Client:

//创建套接字
	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
	//IP地址
	SOCKADDR_IN addrSrv;
	//本地IP
	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);
	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

	char buff[100];
	recv(sockClient,buff,100,0);
	printf("%s\n",buff);
	send(sockClient,"this is client",strlen("this is client")+1,0);
	closesocket(sockClient);
	WSACleanup();

UDP方式:

Server:

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));

	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);
	char buff[100];

	//接收
	recvfrom(sockSrv,buff,100,0,(SOCKADDR*)&addrClient,&len);
	printf("%s\n",buff);

	//发送
	sendto(sockSrv,"server",strlen("server")+1,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));

	closesocket(sockSrv);
	WSACleanup();

Client:

//创建套接字
	SOCKET sockSrv=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(sockSrv,"client",strlen("client")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

	//接收
	char buff[100];
	int len=sizeof(SOCKADDR);
	recvfrom(sockSrv,buff,100,0,(SOCKADDR*)&addrSrv,&len);
	printf("%s\n",buff);

	closesocket(sockSrv);
	WSACleanup();


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值