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] =