注意:博主用的visual studio 2015,在windows调试程序需要链接ws2_32.lib库,才能正常运行程序。
打开项目的“Property”->"Linker"->"Input"->"Additional Dependencies",或者你也可以通过快捷键Alt+F7打开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>\n", 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\n", buf);
fclose(fp);
closesocket(hClntSock);
closesocket(hServSock);
WSACleanup();
return 0;
}
void ErrorHandling(char *message) {
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
#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>\n", 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('\n', stderr);
exit(1);
}
提醒一下:
file_server_win.c必须和其他两个exe执行文件放在同一目录下,否则服务器端fread函数会返回空指针错误
运行方法和结果如图: