面向非连接的socket通信实验

面向非连接就是udp通信

拓扑:

-------------------------------------------------------------------------------------------------------------

                                    Server<---------------------------->Client

                             127.0.0.1:8888

-------------------------------------------------------------------------------------------------------------

了解一下udp socker的步骤

Server:                                                                                                             

1.建立数据报式套接字,返回套接字号s【socket( )】                                           

2.套接字s与本地地址(IP+端口)绑定【bind( )】                                             

3.在套接字ns上读/写数据,直到结束【sendto( )】【recvfrom( )】  

4.关闭套接字ns 【closesocket( )】                                                                 

Client:

1.建立数据报式套接字,返回套接字号s【socket( )】

2.在套接字ns上读/写数据,直到结束【sendto( )】【recvfrom( )】  

3.关闭套接字ns 【closesocket( )】 

客户端不需要绑定地址

-------------------------------------------------------------------------------------------------------------

vs2017编译通过

如果有编译不通过,可以替换老的函数名。

Server:

// Udp_server.cpp: 定义控制台应用程序的入口点。
//
//相关头文件
#include "stdafx.h"
#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
#pragma comment(lib,"WS2_32.lib")

int main()
{
	//初始化
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		printf("WSAStartup initialization failed");
		return 0;
	}

	//变量的声明,赋值
	SOCKET RecvSocket;
	sockaddr_in RecvAddr;
	int Port = 8888;
	char RecvBuf[1024]; //接收缓冲
	char SendBuf[1024]; //发送缓冲
	int BufLen = 1024;
	sockaddr_in SenderAddr;
	int SenderAddrSize = sizeof(SenderAddr);

	//创建接受数据的socket
	RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

	//绑定ip和端口
	RecvAddr.sin_family = AF_INET;
	RecvAddr.sin_port = htons(Port);
	RecvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	bind(RecvSocket, (SOCKADDR *)&RecvAddr, sizeof(RecvAddr));

	
	printf("Server ready:\n");
	while (true) {

		//接收
		int re_number = recvfrom(RecvSocket,
			RecvBuf,
			BufLen,
			0,
			(SOCKADDR *)&SenderAddr,
			&SenderAddrSize
		);
		if (re_number > 0) {
			printf("from client :%s\n", &RecvBuf);
			if (strcmp(RecvBuf, "quit") == 0)
			{
				closesocket(RecvSocket);
				return 0;
			}
		}

		//发送
		gets_s(SendBuf); //获取键盘输入
		
		//发送函数
		int send_number = sendto(RecvSocket, 
			SendBuf, BufLen, 
			0, 
			(SOCKADDR *)&SenderAddr, 
			sizeof(SenderAddr)
		);
		printf("server_to_client: %s\n", SendBuf);
		if (strcmp(SendBuf, "quit") == 0){
			closesocket(RecvSocket);
			return 0;
		}
	}
		if (WSACleanup() == SOCKET_ERROR)
			printf("WSACleanup failed");
		return 0;
	
}

Client

// Udp_Client.cpp: 定义控制台应用程序的入口点。
//
//相关头文件
#include "stdafx.h"
#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
#include <Ws2tcpip.h>  //第35行函数需要此头文件
using namespace std;
#pragma comment(lib,"WS2_32.lib")

int main()
{
	//初始化
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		printf("WSAStartup initialization failed");
		return 0;
	}

	//变量的声明,赋值
	SOCKET SendSocket; 
	sockaddr_in RecvAddr; //服务器端的地址
	int Port = 8888;
	char SendBuf[1024];
	char RecvBuf[1024];
	int BufLen = 1024;
	
	//创建soclket
	SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	
	//设置服务器地址
	RecvAddr.sin_family = AF_INET;
	RecvAddr.sin_port = htons(Port);
	//RecvAddr.sin_addr.s_addr = inet_addr("192.168.1.1"); //vs2017不支持此写法
	InetPton(AF_INET, _T("127.0.0.1"), &RecvAddr.sin_addr.s_addr);
	int RecvAddrSize = sizeof(RecvAddr);
	//向服务器发送数据
	printf("client ready:\n");
	
	while (true) {
		//scanf_s("%s",SendBuf);    //如果使用这个函数,则会向客户端发送死循环的“烫”,原因不明
		
		//发送
		gets_s(SendBuf);
		int  st = sendto(SendSocket,
			SendBuf,
			BufLen,
			0,
			(SOCKADDR *)&RecvAddr,
			sizeof(RecvAddr)
			);
		if (strcmp(SendBuf, "quit") == 0) {
			closesocket(SendSocket);
			return 0;
		}
		
		//接受
		int recv_number = recvfrom(SendSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&RecvAddr, &RecvAddrSize);
		printf("From server: %s\n" ,RecvBuf);
		if (strcmp(RecvBuf, "quit") == 0) {
			closesocket(SendSocket);
			return 0;
		}
		if (st == SOCKET_ERROR) {
			printf("send failed! \n");
			closesocket(SendSocket);
			WSACleanup();
			return -1;
		}
	}


}

实验效果:

猜你喜欢

转载自my.oschina.net/u/3331172/blog/1805679