socket 客户端可以向服务器端接收和发送文件,代码怎么写

客户端可以从服务器端接收文件,也可以发送文件到服务器端要c写的... 客户端可以从服务器端接收文件,也可以发送文件到服务器端
要c写的
展开
 我来答
zhouhaibing089
2014-05-28 · TA获得超过331个赞
知道答主
回答量:80
采纳率:0%
帮助的人:96.2万
展开全部

之前写过这样的一个小程序,我发布在自己的博客上:http://www.zhouhaibing.com/blog/archive/8


Server.c

#include <WinSock2.h>
#include <WS2tcpip.h>
#include <cstdio>
#include <iostream>
// for file read
#include <fstream>
#include <string>

int main() {
/* load the initializer library */
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);

/* list the each fields of wsaData */
// printf("wVersion: %d\n", wsaData.wVersion); // 514
// printf("wHighVersion: %d\n", wsaData.wHighVersion); // 514
// printf("iMaxSockets: %d\n", wsaData.iMaxSockets); // 0
// printf("iMaxUdpDg: %d\n", wsaData.iMaxUdpDg); // 0
/* you may not print the lpVendorInfo */
// printf("szDescription: %s\n", wsaData.szDescription); // WinSock 2.0
// printf("szSystemStatus: %s\n", wsaData.szSystemStatus); // Running

/* create socket(address family, type, protocol) */
int socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

/* initialize the addrinfo hints */
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
struct addrinfo *result = nullptr;
/* by hints, and then get the result(a linked list, see fields below) */
getaddrinfo(NULL, "8080", &hints, &result);
/* the member fiekds of result */
// printf("ai_family: %d\n", result->ai_family); // 2
// printf("ai_socktype: %d\n", result->ai_socktype); // 1
// printf("ai_protocol: %d\n", result->ai_protocol); // 6
// printf("ai_flags: %d\n", result->ai_flags); // 0
// printf("ai_canonname: %s\n", result->ai_canonname); // (null)
// printf("ai_a ddrlen: %d\n", result->ai_addrlen); // 16
// printf("ai_addr->sa_family: %d\n", result->ai_addr->sa_family); // 2
// printf("ai_addr->sa_data: %s\n", result->ai_addr->sa_data); // 
// printf("ai_next: %x\n", result->ai_next); // 0

/* bind the socket to a address */
/* bind(socket, sockaddr name, name len) */
bind(socket_fd, result->ai_addr, result->ai_addrlen);
freeaddrinfo(result);

/* listen the socket */
/* listen(socket, backlog) */
listen(socket_fd, SOMAXCONN); /* 0x7fffffff */

while(true) {
/* accept a connection */
/* accept(socket, addr, addrlen) */
int client_fd = accept(socket_fd, nullptr, 0);

printf("New Connection Eastablished...\n");

/* Now we send the source code of this file to client */
std::ifstream fin("c:\\source.cpp");
/* store it into a buffer. */
while (fin.good()) {
// I rememeber there is a method called getline
std::string s;
getline(fin, s);
// we need a new line
s = s + '\n';
send(client_fd, s.c_str(), s.size(), 0);
}

fin.close();

/* close client socket */
closesocket(client_fd);
}

/* may be never invoked */
closesocket(socket_fd);
WSACleanup();
return 0;
}

Client.c

#include <WinSock2.h>
#include <cstdio>
#include <iostream>
#include <fstream>

int main() {
/* load the initializer library */
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);

/* create socket */
int socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

/* connect */
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(8080);
/* connect(socket, sockaddr, namelen) */
connect(socket_fd, (sockaddr*)&addr, sizeof(addr));

/* buffer memory */
char buf[1024];
/* open a file for write */
std::ofstream fout("source.cpp", std::ios_base::trunc);

while (true) {
int read = recv(socket_fd, buf, 1024, 0); 

if (read == 0) {
fout.close();
printf("Connection Closed...\n");
break;
}
if (read > 1024) {
printf("Buffer Overflow...\n");
} else {
buf[read - 1] = 0;
/* now we can print the bytes from server */
fout << buf << std::endl;
}
}

/* close socket */
closesocket(socket_fd);

WSACleanup();
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式