利用数据报套接字实现数据传输及文件传输

Server:


// server.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h" 
#include <iostream>
#include <cstdio>  
#include <winsock2.h> 
#include <windows.h>

using namespace std;

#pragma comment(lib, "ws2_32.lib")

#define PORT 1234
#define MAX_BUFFER 1024
#define MAX_NAME 1024

DWORD WINAPI ClientThread(LPVOID lpParameter)
{
	//服务端UDP套接字
	SOCKET ClientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	sockaddr_in RemoteAddr;
	RemoteAddr = *((sockaddr_in *)lpParameter);

	int nAddrLen = sizeof(RemoteAddr);

	//服务端端口绑定
	u_short newport = 1234;
	sockaddr_in ServerAddr;
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(newport);
	ServerAddr.sin_addr.S_un.S_addr = INADDR_ANY;

	//尝试绑定新的端口
	while (bind(ClientSocket, (sockaddr *)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR)
	{
		newport++;
		ServerAddr.sin_port = htons(newport);
	}
	
	//通过hello模拟TCP握手
	char * SendBuffer = "HELLO!";
	sendto(ClientSocket, SendBuffer, strlen(SendBuffer), 0, (sockaddr *)&RemoteAddr, nAddrLen);//发送hello

	char choose[100];
	memset(choose, 0, sizeof(choose));
	recvfrom(ClientSocket, choose, MAX_BUFFER, 0, (sockaddr *)&RemoteAddr, &nAddrLen);//接收选择

	int ret;
	if (!strncmp(choose, "1", 2))			//接收数据
	{
		while (true)
		{
			//memset(SendBuffer,0x00,sizeof(SendBuffer));
			char message[MAX_BUFFER];
			memset(message, 0x00, sizeof(message));
			ret = recvfrom(ClientSocket, message, MAX_BUFFER, 0, (sockaddr *)&RemoteAddr, &nAddrLen);//接收数据
			cout << "Receive Messages:" << message << endl;
			sendto(ClientSocket, message, strlen(message), 0, (sockaddr *)&RemoteAddr, nAddrLen);//回显数据
			//显示发送数据的客户端
			//cout << "Client:    Ip:" << inet_ntoa(RemoteAddr.sin_addr) << " ; Port:" << ntohs(RemoteAddr.sin_port) << endl;
		}
	}
	else if (!strncmp(choose, "2", 2))				//接收文件
	{
		while (true)
		{
			char RecvBuffer[MAX_BUFFER];
			char file_name[MAX_NAME];

			//接收文件名
			ret = recvfrom(ClientSocket, file_name, MAX_BUFFER, 0, (sockaddr *)&RemoteAddr, &nAddrLen);
			file_name[ret] = 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值