ハーフクローズベースのファイル転送プログラム(Visual Studio 2015)


注意:ブロガー用のvisual studio 2015は、windowsデバッガでws 2_へのリンクが必要です.32.libライブラリで、プログラムを正常に実行できます.
プロジェクトの「Property」->「Linker」->「Input」->「Additional Dependencies」を開くか、ショートカットAlt+F 7でPropertyページを開くこともできます.操作の仕方がわからず、見ることができますhttp://blog.csdn.net/qq_16542775/article/details/51203465.
ここでは、コードのみを貼り付けます(操作方法と(TCPベースのサーバ側/クライアント方式は同じ!):
file_server_win.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<WinSock2.h>

#define BUF_SIZE 30
void ErrorHandling(char *message);
int main(int argc, char *argv[]) {
	WSADATA wsaData;
	SOCKET hServSock, hClntSock;
	FILE * fp;
	char buf[BUF_SIZE];
	int readCnt;

	SOCKADDR_IN servAdr, clntAdr;
	int clntAdrSz;

	if (argc != 2) {
		printf("Usage: %s<port>
", argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error!"); fp = fopen("file_server_win.c", "rb"); hServSock = socket(PF_INET, SOCK_STREAM, 0); memset(&servAdr, 0, sizeof(servAdr)); servAdr.sin_family = AF_INET; servAdr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); servAdr.sin_port = htons(atoi(argv[1])); bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)); listen(hServSock, 5); clntAdrSz = sizeof(clntAdr); hClntSock = accept(hServSock, (SOCKADDR*)&clntAdr, &clntAdrSz); while (1) { readCnt = fread((void*)buf, 1, BUF_SIZE, fp); if (readCnt < BUF_SIZE) { send(hClntSock, (char*)&buf, readCnt, 0); break; } send(hClntSock, (char*)&buf, BUF_SIZE, 0); } shutdown(hClntSock, SD_SEND); recv(hClntSock, (char*)buf, BUF_SIZE, 0); printf("Message from client: %s
", buf); fclose(fp); closesocket(hClntSock); closesocket(hServSock); WSACleanup(); return 0; } void ErrorHandling(char *message) { fputs(message, stderr); fputc('
', stderr); exit(1); }

file_client_win.c
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<WinSock2.h>

#define BUF_SIZE 30
void ErrorHandling(char *message);

int main(int argc, char *argv[]) {
	WSADATA wsaData;
	SOCKET hSocket;
	FILE *fp;

	char buf[BUF_SIZE];
	int readCnt;
	SOCKADDR_IN servAdr;

	if (argc != 3) {
		printf("Usage: %s <IP> <port>
", argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error!"); fp = fopen("receive.dat", "wb"); hSocket = socket(PF_INET, SOCK_STREAM, 0); memset(&servAdr, 0, sizeof(servAdr)); servAdr.sin_family = AF_INET; servAdr.sin_addr.S_un.S_addr = inet_addr(argv[1]); servAdr.sin_port = htons(atoi(argv[2])); connect(hSocket, (SOCKADDR*)&servAdr, sizeof(servAdr)); while ((readCnt = recv(hSocket, buf, BUF_SIZE, 0)) != 0) fwrite((void*)buf, 1, readCnt, fp); puts("Received file data"); send(hSocket, "Thank you", 10,0); fclose(fp); closesocket(hSocket); WSACleanup(); return 0; } void ErrorHandling(char *message) { fputs(message, stderr); fputc('
', stderr); exit(1); }

注意:
file_server_win.c他の2つのexe実行ファイルと同じディレクトリに置く必要があります.そうしないと、サーバ側fread関数は空のポインタエラーを返します.
基于半关闭的文件传输程序(Visual Studio 2015)_第1张图片
実行方法と結果を図のように示します.
基于半关闭的文件传输程序(Visual Studio 2015)_第2张图片