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

来源:互联网 发布:mac d for danger 编辑:程序博客网 时间:2024/05/21 22:42

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 1024DWORD 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);//发送hellochar 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] = '\0';//打开文件FILE * fp;if (!(fp = fopen(file_name, "wb"))){cout << "File: " << file_name << " Can't Open" << endl;return -1;}memset(RecvBuffer, 0, MAX_BUFFER);//接收文件int file_len = 0;while ((file_len = recvfrom(ClientSocket, RecvBuffer, MAX_BUFFER, 0, (sockaddr *)&RemoteAddr, &nAddrLen))){//cout << "The Length Of The File: "<< file_len << endl;if (file_len == INVALID_SOCKET || file_len == 0){cout << "Receive Error" << endl;return -1;}ret = fwrite(RecvBuffer, sizeof(char), file_len, fp);//写文件//fflush(fp);//磁盘刷新if (ret < file_len){cout << file_name << " Failed" << endl;break;}memset(RecvBuffer, 0, MAX_BUFFER);}cout << "Receive: " << file_name << " Successful!" << endl;//cout << "Client:   Ip:" << inet_ntoa(RemoteAddr.sin_addr) << " ; Port:" << ntohs(RemoteAddr.sin_port) << endl;}}return 0;}int main(int argc, char* argv[]){SOCKET ServerSocket;//服务器套接字SOCKET ClientSocket;//客服端套接字sockaddr_in ServerAddr;//服务器地址sockaddr_in ClientAddr;//客户端地址int iResult; //返回的结果memset(&ServerAddr, 0, sizeof(ServerAddr));//初始化SOCKET DLLWSADATA WsaData;//WSADATA变量iResult = WSAStartup(MAKEWORD(2, 2), &WsaData);if (iResult != 0){cout << "WSAStartup failed with error: " << iResult << endl;system("pause");return -1;}//创建SOCKETServerSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (ServerSocket == INVALID_SOCKET){cout << "Socket failed with error:" << WSAGetLastError() << endl;system("pause");WSACleanup();return -1;}//服务器套接字地址ServerAddr.sin_family = AF_INET;ServerAddr.sin_port = htons(PORT);ServerAddr.sin_addr.S_un.S_addr = INADDR_ANY;//绑定socket和服务器地址iResult = bind(ServerSocket, (sockaddr *)&ServerAddr, sizeof(ServerAddr));if (iResult == SOCKET_ERROR){cout << "Bind Failed With Error:" << WSAGetLastError() << endl;system("pause");closesocket(ServerSocket);   //关闭套接字  WSACleanup();  //释放套接字资源; return -1;}//创建连接cout << "Server is started!\nWaiting For Connecting...\n" << endl;sockaddr_in RemoteAddr;int nAddrLen = sizeof(RemoteAddr);while (true){char choose[100];memset(choose, 0, sizeof(choose));recvfrom(ServerSocket, choose, MAX_BUFFER, 0, (sockaddr *)&RemoteAddr, &nAddrLen);//接收选择if (!strncmp(choose, "1", 2)){cout << "---数据传输---" << endl;char RecvBuffer[MAX_BUFFER];memset(RecvBuffer, 0x00, sizeof(RecvBuffer));int ret = recvfrom(ServerSocket, RecvBuffer, MAX_BUFFER, 0, (sockaddr *)&RemoteAddr, &nAddrLen);//接收helloif (!ret){cout << "Receive Failed:" << GetLastError() << endl;}//cout << "Client Connect Success!" << endl;cout << "Client Connect Success!\n" << "Client:   Ip:" << inet_ntoa(RemoteAddr.sin_addr) << " ; Port:" << ntohs(RemoteAddr.sin_port) << endl;HANDLE hThread = CreateThread(NULL, 0, ClientThread, &RemoteAddr, 0, NULL);CloseHandle(hThread);}else if (!strncmp(choose, "2", 2)){cout << "---文件传输---" << endl;char RecvBuffer[MAX_BUFFER];memset(RecvBuffer, 0x00, sizeof(RecvBuffer));int ret = recvfrom(ServerSocket, RecvBuffer, MAX_BUFFER, 0, (sockaddr *)&RemoteAddr, &nAddrLen);//接收helloif (!ret){cout << "Receive Failed:" << GetLastError() << endl;}//cout << "Client Connect Success!" << endl;cout << "Client Connect Success!\n" << "Client:   Ip:" << inet_ntoa(RemoteAddr.sin_addr) << " ; Port:" << ntohs(RemoteAddr.sin_port) << endl;HANDLE hThread = CreateThread(NULL, 0, ClientThread, &RemoteAddr, 0, NULL);CloseHandle(hThread);}}closesocket(ServerSocket);WSACleanup();system("pause");return 0;}


Client:


// client.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdio.h>#include <iostream>#include <winsock2.h>using namespace std;#pragma comment(lib, "ws2_32.lib")#define PORT 1234#define MAX_BUFFER 1024int main(int argc, char* argv[]){SOCKET sclient;//客户端套接字int iResult;  //返回的结果//初始化SOCKET DLLWSADATA WsaData;iResult = WSAStartup(MAKEWORD(2, 2), &WsaData);if (iResult != 0){cout << "Init Windows Socket Failed:" << iResult << endl;system("pause");return -1;}//创建SOCKETsclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sclient == INVALID_SOCKET){cout << "Create Socket Failed:" << WSAGetLastError() << endl;system("pause");WSACleanup();return  -1;}sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");int len = sizeof(sin);char choose[10];cout << "Select The Functions:    1. Send the message  or  2. Send the file " << endl;cin >> choose;getchar();char SendBuffer[MAX_BUFFER];char RecvBuffer[MAX_BUFFER];if (!strncmp(choose, "1", 2))//发送数据{sendto(sclient, choose, strlen(choose), 0, (sockaddr *)&sin, len);//通过hello模拟TCP握手char * sendData_ = "HELLO!";sendto(sclient, sendData_, strlen(sendData_), 0, (sockaddr *)&sin, len);//发送hellomemset(RecvBuffer, 0x00, sizeof(RecvBuffer));int ret = recvfrom(sclient, RecvBuffer, MAX_BUFFER, 0, (sockaddr *)&sin, &len);//接收hellosendto(sclient, choose, strlen(choose), 0, (sockaddr *)&sin, len);//再次传输选择,使线程选择模式while (true){cout << "---数据传输---" << endl;cout << "Send Message : ";memset(SendBuffer, 0x00, sizeof(SendBuffer));cin >> SendBuffer;getchar();sendto(sclient, SendBuffer, strlen(SendBuffer), 0, (sockaddr *)&sin, len);//发送数据cout << "Server:   Ip:" << inet_ntoa(sin.sin_addr) << " ; Port:" << ntohs(sin.sin_port) << endl;memset(RecvBuffer, 0x00, sizeof(RecvBuffer));ret = recvfrom(sclient, RecvBuffer, MAX_BUFFER, 0, (sockaddr *)&sin, &len);//回显数据if (ret > 0){cout << "Receive From Server: " << RecvBuffer << endl;memset(RecvBuffer, 0x00, sizeof(RecvBuffer));}else{cout << "Receive Error : " << WSAGetLastError();cout << "\n" << endl;                break;  }}}else if (!strncmp(choose, "2", 2))//发送文件{sendto(sclient, choose, strlen(choose), 0, (sockaddr *)&sin, len);char * sendData_ = "HELLO!";sendto(sclient, sendData_, strlen(sendData_), 0, (sockaddr *)&sin, len);//发送hellocout << "Client OK!" << endl;memset(RecvBuffer, 0x00, sizeof(RecvBuffer));int ret = recvfrom(sclient, RecvBuffer, MAX_BUFFER, 0, (sockaddr *)&sin, &len);//接收hellosendto(sclient, choose, strlen(choose), 0, (sockaddr *)&sin, len);//再次传输选择,使线程选择模式while (true){cout << "---文件传输---" << endl;FILE *fp;char file_name[MAX_PATH];cout << "Please Input The Filename:" << endl;cin >> file_name;//传送文件名sendto(sclient, file_name, strlen(file_name), 0, (sockaddr *)&sin, len);if (!(fp = fopen(file_name, "rb"))){cout << "File " << file_name << " Can't Open" << endl;continue;}memset(SendBuffer, 0x00, sizeof(SendBuffer));//传送文件int length;while ((length = fread(SendBuffer, sizeof(char), sizeof(SendBuffer), fp)) > 0){//cout << "length=" << length << endl;//cout << SendBuffer << endl;ret = sendto(sclient, SendBuffer, length, 0, (sockaddr *)&sin, len);if (ret == SOCKET_ERROR || ret == 0){cout << "Wrong" << endl;return -1;}memset(SendBuffer, 0, sizeof(SendBuffer));}ret = sendto(sclient, SendBuffer, length, 0, (sockaddr *)&sin, len);if (ret == SOCKET_ERROR){cout << "Error!" << endl;return -1;}else{cout << "Send Successfully!" << endl;}fclose(fp);cout << "Server:   Ip:" << inet_ntoa(sin.sin_addr) << " ; Port:" << ntohs(sin.sin_port) << endl;}}closesocket(sclient);system("pause");WSACleanup();return 0;}



阅读全文
0 0
原创粉丝点击