Linux服务端程序
//server_file.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handling(char *message);
int main(int argc,char* argv[]){
int serv_sd, clnt_sd;
FILE *fp;
char buf[BUF_SIZE];
int read_cnt;
struct sockaddr_in serv_adr, clnt_adr;
socklen_t clnt_adr_sz;
if(argc!=2){
printf("Usage : %s <port>\n",argv[0]);
exit(1);
}
fp=fopen("source.jpg", "rb");
serv_sd=socket(PF_INET, SOCK_STREAM,0);
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_adr.sin_port=htons(atoi(argv[1]));
bind(serv_sd, (struct sockaddr*)&serv_adr, sizeof(serv_adr));
listen(serv_sd, 5);
clnt_adr_sz=sizeof(clnt_adr);
clnt_sd=accept(serv_sd, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
while(1){
read_cnt=fread((void*)buf, 1, BUF_SIZE, fp);
if(read_cnt<BUF_SIZE){
write(clnt_sd, buf, read_cnt);
break;
}
write(clnt_sd, buf, BUF_SIZE);
}
shutdown(clnt_sd, SHUT_WR);
read(clnt_sd, buf, BUF_SIZE);
printf("Message from client: %s \n", buf);
fclose(fp);
close(clnt_sd);
close(serv_sd);
return 0;
}
void error_handling(char *message){
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
Win客户端程序
//file_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <winsock.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.jpg", "wb");
hSocket = socket(PF_INET, SOCK_STREAM, 0);
memset(&servAdr, 0, sizeof(servAdr));
servAdr.sin_family = AF_INET;
servAdr.sin_addr.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 date");
send(hSocket, "Fuck Off", 10, 0);
fclose(fp);
closesocket(hSocket);
WSACleanup();
return 0;
}
void ErrorHandling(char *message){
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
运行:
#gcc file_server.c -o fileserver
编译file_client.c -> fileclient.exe
./fileserver 服务器端口
./filecientexe 服务器ip 服务器端口
就可以从Linux服务器商下载source.jpg到Win客户端保存为receive.jpg