注意:博主用的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函数会返回空指针错误