windows c语言传输文件,windows平台c语言使用socket通信传送图片

传图片其实就是传二进制文件。定义一个数据包,每次收发数据包,即可。

服务器端:

#include

#include

#include

#define SERVER_PORT 9210 //侦听端口

#pragma comment(lib,"ws2_32.lib")

struct Data //数据包

{

int number;

int length;

char receivemessage[2000]; //内容信息

int fin;

}data;

void main()

{

FILE * fp;

if( !(fp=fopen("E://1.bmp","wb+")) )

{

printf("open E://1.bmp error");

exit(0);

}

WORD wVersionRequested;//双字节;高字节存取副版本号,低字节存取高版本号。

WSADATA wsaData;//存取套接字实现的具体信息

int ret, nLeft, length;

SOCKET sListen, sServer; //侦听套接字,连接套接字

struct sockaddr_in saServer, saClient; //地址信息

char *ptr;//用于遍历信息的指针

//WinSock初始化

wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本为2.2

ret=WSAStartup(wVersionRequested, &wsaData); //开始使用Winsock软件启动套接字

if(ret!=0)

{

printf("WSAStartup() failed!\n");

return;

}

//创建Socket,使用TCP协议

sListen=socket(AF_INET, SOCK_STREAM,0);

if (sListen == INVALID_SOCKET)

{

WSACleanup();

printf("socket() faild!\n");

return;

}

//构建本地地址信息

saServer.sin_family = AF_INET; //地址家族

saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序

saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY) ; //使用INADDR_ANY 指示任意地址

//绑定

ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));

if (ret == SOCKET_ERROR)

{

printf("bind() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //关闭套接字

WSACleanup();

return;

}

//侦听连接请求

ret = listen(sListen, 5);

if (ret == SOCKET_ERROR)

{

printf("listen() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //关闭套接字

return;

}

printf("Waiting for client connecting!\n");

printf("Tips: Ctrl+c to quit!\n");

length = sizeof(saClient);

sServer = accept(sListen, (struct sockaddr *)&saClient, &length);

if (sServer == INVALID_SOCKET)

{

printf("accept() faild! code:%d\n", WSAGetLastError());

closesocket(sListen); //关闭套接字

WSACleanup();

return;

}

char flag='0';

char receivemessage[9000];

//阻塞等待接受客户端连接

while(!data.fin)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。

{

memset(data.receivemessage,'0',sizeof(data.receivemessage));

//fread((void *)sServer,8192,1,fp);

ret = recv(sServer, (char *)&data, sizeof(struct Data),0); //第二个参数使用强制类型,为一个数据包

if (ret == SOCKET_ERROR)

{

printf("recv() failed!\n");

return;

}

if (ret == 0) //客户端已经关闭连接

{

printf("Client has closed the connection\n");

break;

}

fwrite(data.receivemessage,data.length,1,fp);

//recv(sServer,&flag,1,0);

}

}

// closesocket(sListen);

// closesocket(sServer);

// WSACleanup();

客户端

#include

#include

#include

#define SERVER_PORT 9210 //侦听端口

#pragma comment(lib,"ws2_32.lib")

struct Data

{

int number;

int length;

char sendMessage[2000];

int fin;

}data;

void main()

{

//struct Data data;

FILE * fp;

fp=fopen("E://example.bmp","rb+");

WORD wVersionRequested;

WSADATA wsaData;

int ret;

SOCKET sClient; //连接套接字

struct sockaddr_in saServer; //地址信息

char *ptr;

BOOL fSuccess = TRUE;

fseek(fp,0,SEEK_END);

int end = ftell(fp);

fseek(fp,0,0);

//WinSock初始化

wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本

ret = WSAStartup(wVersionRequested, &wsaData);

if(ret!=0)

{

printf("WSAStartup() failed!\n");

return;

}

//确认WinSock DLL支持版本2.2

if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)

{

WSACleanup();

printf("Invalid WinSock version!\n");

return;

}

//创建Socket,使用TCP协议

sClient = socket(AF_INET, SOCK_STREAM,0);

if (sClient == INVALID_SOCKET)

{

WSACleanup();

printf("socket() failed!\n");

return;

}

//构建服务器地址信息

saServer.sin_family = AF_INET; //地址家族

saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序

saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.111");

//连接服务器

ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));

if (ret == SOCKET_ERROR)

{

printf("connect() failed!\n");

closesocket(sClient); //关闭套接字

WSACleanup();

return;

}

char sendMessage[2000];

int sum=0;

int times=0;

char flag='0';

while(end>0)

{

memset(data.sendMessage,'0',sizeof(data.sendMessage));

fread(data.sendMessage,1024,1,fp);

if(end>=1024) //剩余很多信息

{

data.fin = 0;

data.length = 1024;

}

else

{

data.fin = 1;

data.length = end;

//flag = '1';

}

ret = send(sClient, (char *)&data,sizeof(struct Data),0);

if (ret == SOCKET_ERROR)

{

printf("send() failed!\n");

}

else

//printf("client info has been sent!");

//sum+=1024;

end -= 1024;

//ret = send(sClient, (char *)&flag,1,0);

}

while(1);

closesocket(sClient); //关闭套接字

WSACleanup();

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值