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;
}



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

tcp传输图片

  • 2016年08月28日 11:04
  • 2KB
  • 下载

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

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

通过TCP/IP协议发送图片到服务端

我是黑体字 我是微软雅黑 我是华文彩云 color=#0099ff size=72 face=”黑体” color=#00ffff color=gray 客户端 客户端 http://...
  • happy_xiahuixiax
  • happy_xiahuixiax
  • 2017年05月24日 18:02
  • 495

tcp传输图片(发送端使用sendfile函数)

 客户端client向服务器server发送一幅图片,使用tcp传输:   服务器代码: #include sys/socket.h> #include sys/ty...
  • mianhuantang848989
  • mianhuantang848989
  • 2017年06月21日 18:18
  • 212

java文件传输,基于tcp/ip的文件传输

  • 2010年03月08日 17:48
  • 3KB
  • 下载

使用TCP从客户端上传图片到服务器端

客户端: package upload.tcp; import java.io.FileInputStream; import java.io.IOException; import ...
  • fandoudou123
  • fandoudou123
  • 2015年10月27日 19:40
  • 691

Java---网络编程(3)-TCP-互传文件和图片

☆ TCP建立连接,形成传输数据的通道。 在连接中进行大数据量传输 通过三次握手完成连接,是可靠协议 必须建立连接,效率会稍低Socket 和 ServerSocket类TCP传输TCP So...
  • qq_26525215
  • qq_26525215
  • 2016年05月10日 14:25
  • 9533

Java TCP使用Socket进行网络图片传送(6)

本文演示,使用Socket进行网络图片传送,实现客户端的client.bmp文件上传到服务端。 1)客户端,上传client.bmp图片给服务端,并接受服务端返回的“上传成功”消息。 2)服务端,接受...
  • u012339743
  • u012339743
  • 2014年09月17日 10:35
  • 5887

TcpLister和TcpClient进行文件传输

TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议。TCP建立一个连接需要三次握手,而终止一个连接要经过四次握手。一旦通信双方建立了TCP连接,连接中的任何一方都能向对方发送数据和接受对方发来...
  • u014800094
  • u014800094
  • 2017年03月16日 11:12
  • 676

Java利用TCP进行文件的传输

Java利用TCP进行文件的传输 参考了该篇文章http://wenku.baidu.com/view/71baf9db50e2524de5187ea0.html 并对其进行了简化与改动   ...
  • wq350778209
  • wq350778209
  • 2014年04月09日 16:06
  • 4122
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows基于TCP/IP的简单文件/图片传输
举报原因:
原因补充:

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