windows基于TCP/IP的简单文件/图片传输

原创 2015年11月21日 17:04:41
详细函数资料参考msdn

// TransPic_Server.cpp : 定义控制台应用程序的入口点。
/*
	Server.cpp
*/
//

#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#define BUF 256
#pragma comment(lib, "Ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsaData = { 0 };
	int iResult = 0;
	// Initialize Winsock
	iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != 0) {
		wprintf(L"WSAStartup failed: %d\n", iResult);
		return 1;
	}

	struct sockaddr_in servaddr;
	int bResult = 0;
	SOCKET sock = INVALID_SOCKET;
	char buf[BUF];

	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	if (sock == INVALID_SOCKET) {
		wprintf(L"socket failed with error: %ld\n", GetLastError());
		WSACleanup();
		return 1;
	}

	servaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(8888);

	bResult = bind(sock, (struct sockaddr *)&servaddr, sizeof(struct sockaddr_in));
	if (bResult == INVALID_SOCKET) {
		wprintf(L"bind failed with error: %ld\n", GetLastError());
		closesocket(sock);
		WSACleanup();
		return 1;
	}

	if (listen(sock, 256) == SOCKET_ERROR)
	{
		wprintf(L"listen failed with error: %ld\n", GetLastError());
		closesocket(sock);
		WSACleanup();
		return 1;
	}

	SOCKET acceptsock = INVALID_SOCKET;

	printf("Accepting ...\n");
	if ((acceptsock = accept(sock, NULL, NULL)) == INVALID_SOCKET)
	{
		wprintf(L"accept failed with error: %ld\n", GetLastError());
		closesocket(sock);
		WSACleanup();
		return 1;
	}
	else
		printf("Client connected.\n");

	FILE *fp = NULL;
	// 不能以二进制打开txt耶
	if ((fp = fopen("popkart.jpg", "rb")) == NULL)
	{
		wprintf(L"fopen failed with error: %ld\n", GetLastError());
		closesocket(sock);
		WSACleanup();
		return 1;
	}
	size_t size = 0;
	while (!feof(fp))
	{
		size = fread(buf, sizeof(char), sizeof(buf), fp);
		if (send(acceptsock, buf, size, 0) == SOCKET_ERROR)
		{
			wprintf(L"send failed with error: %ld\n", GetLastError());
			closesocket(sock);
			closesocket(acceptsock);
			WSACleanup();
			return 1;
		}
	}
	printf("send picture finish.\n");
	
	// 将缓冲区的内容全发送出去,调用closesock之前不可少
	shutdown(acceptsock, SD_SEND);
	closesocket(acceptsock);
	closesocket(sock);
	WSACleanup();

	system("pause");
	return 0;
}


// TransPic_Client.cpp : 定义控制台应用程序的入口点。
/*
	Client.cpp
*/
//

#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#define BUF 256
#pragma comment(lib, "Ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{

	//----------------------
	// Initialize Winsock
	WSADATA wsaData;
	int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != NO_ERROR) {
		wprintf(L"WSAStartup function failed with error: %d\n", iResult);
		return 1;
	}
	//----------------------
	// Create a SOCKET for connecting to server
	SOCKET ConnectSocket;
	ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (ConnectSocket == INVALID_SOCKET) {
		wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}
	//----------------------
	// The sockaddr_in structure specifies the address family,
	// IP address, and port of the server to be connected to.
	sockaddr_in clientService;
	clientService.sin_family = AF_INET;
	clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
	clientService.sin_port = htons(8888);

	//----------------------
	// Connect to server.
	iResult = connect(ConnectSocket, (SOCKADDR *)& clientService, sizeof(clientService));
	if (iResult == SOCKET_ERROR) {
		wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
		iResult = closesocket(ConnectSocket);
		if (iResult == SOCKET_ERROR)
			wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}
	wprintf(L"Connected to server.\n");

	//------------------------
	// Start to recv picture data
	FILE *fp = NULL;
	if ((fp = fopen("popkart.jpg", "wb+")) == NULL)
	{
		closesocket(ConnectSocket);
		wprintf(L"fopen function failed with error: %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	size_t size = 0;
	char buf[BUF];
	do
	{
		size = recv(ConnectSocket, buf, sizeof(buf), MSG_WAITALL);
		// 对端调用了closesock,则返回SOCKET_ERROR
		if (size == SOCKET_ERROR)
		{
			break;
		}
		fwrite(buf, size, 1, fp);
		// 这里,循环条件是读取的字节数是否等于BUF,可能出现文件大小刚好是BUF的整数倍,故shutdown来辅助判断
	} while (size == sizeof(buf));

	fclose(fp);

	printf("read finish.\n");
	// End recv
	//------------------------
	

	iResult = closesocket(ConnectSocket);
	if (iResult == SOCKET_ERROR) {
		wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	WSACleanup();
	system("pause");
	return 0;
}



版权声明:本文为博主原创文章,未经博主不允许随意转载。

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++基于TCP/IP简单的客户端、服务器通信程序实例

本篇文章实现了一个基于TCP 的

Windows Socket 异步编程(非阻塞模式)

1. Windows平台提供了5种非阻塞Socket编程模型: Select模型(集合管理多个Socket,集合中有64个元素,可以管理1024个socket) WSAAsyncSelec...
  • HMSIWTV
  • HMSIWTV
  • 2012年09月06日 19:24
  • 2653

TCP传输大文件(图片、文档)

遇到TCP传输大文件问题,主要是 (1)、传输快,但拼接成的大文件数据错 (2)、加校验,传输变慢 (3)、接收包数跟发送包数不对应 费了一段时间才解决。 今天,整理一下,留以后备用。 首...
  • cbffyx
  • cbffyx
  • 2013年10月11日 15:27
  • 3034

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++利用socket的客户端和服务器之间传输文件

//服务器的代码文件有 /* message.h source.h source.cpp server.h server.cpp */ //客户端的代码文件有 /* message.h 和服务器端...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++中TCP/IP按约定报文协议接收数据完成拼包

有段时间没有更新博客了,近来比较忙,没有顾上写博客。终于完成了一个大任务,有时间回顾一下这段时间的成果。这篇博客,先介绍和总结一下很久前的工作。TCP/IP接收数据拼包。由于时间太长很多东西记不清楚了...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows基于TCP/IP的简单文件/图片传输
举报原因:
原因补充:

(最多只允许输入30个字)