Windows网络编程之winsock实现文件传输示例

2025-05-27 0 101

本文实例展示了Windows网络编程winsock实现文件传输的方法,对于进行Windows下的winsock网络编程有一定的借鉴参考价值。

该程序代码主要是基于TCP流协议的winsock网络文件传输示例,采用Windows下的C语言编写。可以实现传递任何格式文件的文件传输功能。

具体实现代码如下:

Server端代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114
/*************************************************************************

> File Name: Win_Server.c

> Author: SongLee

************************************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <WinSock2.h>

#define PORT 8087

#define SERVER_IP "127.0.0.1"

#define BUFFER_SIZE 1024

#define FILE_NAME_MAX_SIZE 512

#pragma comment(lib, "WS2_32")

int main()

{

// 声明并初始化一个服务端(本地)的地址结构

sockaddr_in server_addr;

server_addr.sin_family = AF_INET;

server_addr.sin_addr.S_un.S_addr = INADDR_ANY;

server_addr.sin_port = htons(PORT);

// 初始化socket dll

WSADATA wsaData;

WORD socketVersion = MAKEWORD(2, 0);

if(WSAStartup(socketVersion, &wsaData) != 0)

{

printf("Init socket dll error!");

exit(1);

}

// 创建socket

SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, 0);

if (SOCKET_ERROR == m_Socket)

{

printf("Create Socket Error!");

exit(1);

}

//绑定socket和服务端(本地)地址

if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))

{

printf("Server Bind Failed: %d", WSAGetLastError());

exit(1);

}

//监听

if (SOCKET_ERROR == listen(m_Socket, 10))

{

printf("Server Listen Failed: %d", WSAGetLastError());

exit(1);

}

while(1)

{

printf("Listening To Client...\\n");

sockaddr_in client_addr;

int client_addr_len = sizeof(client_addr);

SOCKET m_New_Socket = accept(m_Socket, (sockaddr *)&client_addr, &client_addr_len);

if (SOCKET_ERROR == m_New_Socket)

{

printf("Server Accept Failed: %d", WSAGetLastError());

break;

}

char buffer[BUFFER_SIZE];

memset(buffer, 0, BUFFER_SIZE);

if (recv(m_New_Socket, buffer, BUFFER_SIZE, 0) < 0)

{

printf("Server Receive Data Failed!");

break;

}

char file_name[FILE_NAME_MAX_SIZE+1];

memset(file_name, 0, FILE_NAME_MAX_SIZE+1);

strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));

printf("%s\\n", file_name);

FILE * fp = fopen(file_name, "rb"); //windows下是"rb",表示打开一个只读的二进制文件

if (NULL == fp)

{

printf("File: %s Not Found\\n", file_name);

}

else

{

memset(buffer, 0, BUFFER_SIZE);

int length = 0;

while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)

{

if (send(m_New_Socket, buffer, length, 0) < 0)

{

printf("Send File: %s Failed\\n", file_name);

break;

}

memset(buffer, 0, BUFFER_SIZE);

}

fclose(fp);

printf("File: %s Transfer Successful!\\n", file_name);

}

closesocket(m_New_Socket);

}

closesocket(m_Socket);

//释放winsock库

WSACleanup();

return 0;

}

Client端代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101
/*************************************************************************

> File Name: Win_Client.c

> Author: SongLee

************************************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <WinSock2.h>

#define PORT 8087

#define SERVER_IP "127.0.0.1"

#define BUFFER_SIZE 1024

#define FILE_NAME_MAX_SIZE 512

#pragma comment(lib, "WS2_32")

int main()

{

// 初始化socket dll

WSADATA wsaData;

WORD socketVersion = MAKEWORD(2, 0);

if(WSAStartup(socketVersion, &wsaData) != 0)

{

printf("Init socket dll error!");

exit(1);

}

//创建socket

SOCKET c_Socket = socket(AF_INET, SOCK_STREAM, 0);

if (SOCKET_ERROR == c_Socket)

{

printf("Create Socket Error!");

system("pause");

exit(1);

}

//指定服务端的地址

sockaddr_in server_addr;

server_addr.sin_family = AF_INET;

server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);

server_addr.sin_port = htons(PORT);

if (SOCKET_ERROR == connect(c_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))

{

printf("Can Not Connect To Server IP!\\n");

system("pause");

exit(1);

}

//输入文件名

char file_name[FILE_NAME_MAX_SIZE+1];

memset(file_name, 0, FILE_NAME_MAX_SIZE+1);

printf("Please Input File Name On Server: ");

scanf("%s", &file_name);

char buffer[BUFFER_SIZE];

memset(buffer, 0, BUFFER_SIZE);

strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE ? BUFFER_SIZE:strlen(file_name));

//向服务器发送文件名

if(send(c_Socket, buffer, BUFFER_SIZE, 0) < 0)

{

printf("Send File Name Failed\\n");

system("pause");

exit(1);

}

//打开文件,准备写入

FILE * fp = fopen(file_name, "wb"); //windows下是"wb",表示打开一个只写的二进制文件

if(NULL == fp)

{

printf("File: %s Can Not Open To Write\\n", file_name);

system("pause");

exit(1);

}

else

{

memset(buffer, 0, BUFFER_SIZE);

int length = 0;

while ((length = recv(c_Socket, buffer, BUFFER_SIZE, 0)) > 0)

{

if (fwrite(buffer, sizeof(char), length, fp) < length)

{

printf("File: %s Write Failed\\n", file_name);

break;

}

memset(buffer, 0, BUFFER_SIZE);

}

printf("Receive File: %s From Server Successful!\\n", file_name);

}

fclose(fp);

closesocket(c_Socket);

//释放winsock库

WSACleanup();

system("pause");

return 0;

}

程序中备有较为详尽的注释,相信大家不难理解。感兴趣的朋友可以根据自身需要对程序加以灵活改善,使其功能更加强大。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Windows网络编程之winsock实现文件传输示例 https://www.kuaiidc.com/75919.html

相关文章

发表评论
暂无评论