Windows下C 用 Socket 发送图片--基础

Windows下C 用 Socket 发送图片--基础

转载:http://blog.csdn.net/yulinxx/article/details/51338214


服务器端:

  1. #include <stdio.h>  
  2. #include <winsock2.h>  
  3. #include <winsock2.h>  
  4. #define SERVER_PORT 9210 //侦听端口  
  5. #pragma comment(lib,"ws2_32.lib")  
  6.   
  7. struct Data //数据包  
  8. {  
  9.     int length;  
  10.     char receivemessage[2000]; //内容信息  
  11.     int fin;  
  12. }data;  
  13.   
  14. int main()  
  15. {  
  16.     FILE * fp;  
  17.     if (!(fp = fopen("abc.jpg""wb+")))  
  18.     {  
  19.         printf("open abc.jpg error");  
  20.         exit(0);  
  21.     }  
  22.     WORD wVersionRequested;//双字节;高字节存取副版本号,低字节存取高版本号。  
  23.     WSADATA wsaData;//存取套接字实现的具体信息  
  24.     int ret,  length;  
  25.     SOCKET sListen, sServer; //侦听套接字,连接套接字  
  26.     struct sockaddr_in saServer, saClient; //地址信息    
  27.    
  28.     //WinSock初始化  
  29.     wVersionRequested = MAKEWORD(2, 2);   
  30.     ret = WSAStartup(wVersionRequested, &wsaData);   
  31.     if (ret != 0)  
  32.     {  
  33.         printf("WSAStartup() failed!\n");  
  34.         return 0;  
  35.     }  
  36.     //创建Socket,使用TCP协议  
  37.     sListen = socket(AF_INET, SOCK_STREAM, 0);  
  38.     if (sListen == INVALID_SOCKET)  
  39.     {  
  40.         WSACleanup();  
  41.         printf("socket() faild!\n");  
  42.         return 0;  
  43.     }  
  44.     //构建本地地址信息  
  45.     saServer.sin_family = AF_INET; //地址家族  
  46.     saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序  
  47.     saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址   
  48.   
  49.                                                        //绑定  
  50.     ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));  
  51.     if (ret == SOCKET_ERROR)  
  52.     {  
  53.         printf("bind() faild! code:%d\n", WSAGetLastError());  
  54.         closesocket(sListen); //关闭套接字  
  55.         WSACleanup();  
  56.         return 0;  
  57.     }  
  58.   
  59.     //侦听连接请求  
  60.     ret = listen(sListen, 5);  
  61.     if (ret == SOCKET_ERROR)  
  62.     {  
  63.         printf("listen() faild! code:%d\n", WSAGetLastError());  
  64.         closesocket(sListen); //关闭套接字  
  65.         return 0;  
  66.     }  
  67.   
  68.     printf("Waiting for client connecting!\n");  
  69.     printf("Tips: Ctrl+c to quit!\n");  
  70.     length = sizeof(saClient);  
  71.     sServer = accept(sListen, (struct sockaddr *)&saClient, &length);  
  72.     if (sServer == INVALID_SOCKET)  
  73.     {  
  74.         printf("accept() faild! code:%d\n", WSAGetLastError());  
  75.         closesocket(sListen); //关闭套接字  
  76.         WSACleanup();  
  77.         return 0;  
  78.     }  
  79.   
  80.     //阻塞等待接受客户端连接  
  81.     while (!data.fin)  
  82.     {  
  83.         memset(data.receivemessage, '0'sizeof(data.receivemessage));  
  84.         ret = recv(sServer, (char *)&data, sizeof(struct Data), 0);  //第二个参数使用强制类型,为一个数据包  
  85.         if (ret == SOCKET_ERROR)  
  86.         {  
  87.             printf("recv() failed!\n");  
  88.             return 0;  
  89.         }  
  90.         if (ret == 0) //客户端已经关闭连接  
  91.         {  
  92.             printf("Client has closed the connection\n");  
  93.             break;  
  94.         }  
  95.         fwrite(data.receivemessage, data.length, 1, fp);  
  96.     }  
  97.   
  98.       closesocket(sListen);  
  99.       closesocket(sServer);  
  100.       WSACleanup();  
  101.     return 0;  
  102. }  


客户端:

  1. #define _WINSOCK_DEPRECATED_NO_WARNINGS  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <winsock2.h>  
  5. #define SERVER_PORT 9210 //侦听端口  
  6. #pragma comment(lib,"ws2_32.lib")  
  7.   
  8. struct Data  
  9. {  
  10.     int length;  
  11.     char sendMessage[2000];  
  12.     int fin;  
  13. }data;  
  14.   
  15. int main()  
  16. {  
  17.     FILE * fp;  
  18.     errno_t err = fopen_s(&fp, "D:\\7.jpg""rb+");  
  19.     WORD wVersionRequested;  
  20.     WSADATA wsaData;  
  21.     int ret;  
  22.     SOCKET sClient; //连接套接字  
  23.     struct sockaddr_in saServer; //地址信息  
  24.   
  25.     BOOL fSuccess = TRUE;  
  26.   
  27.     fseek(fp, 0, SEEK_END);  
  28.     int end = ftell(fp);  
  29.     fseek(fp, 0, 0);  
  30.     //WinSock初始化  
  31.     wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本  
  32.     ret = WSAStartup(wVersionRequested, &wsaData);  
  33.     if (ret != 0)  
  34.     {  
  35.         printf("WSAStartup() failed!\n");  
  36.         return 0;  
  37.     }  
  38.     //确认WinSock DLL支持版本2.2  
  39.     if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)  
  40.     {  
  41.         WSACleanup();  
  42.         printf("Invalid WinSock version!\n");  
  43.         return 0;  
  44.     }  
  45.     //创建Socket,使用TCP协议  
  46.     sClient = socket(AF_INET, SOCK_STREAM, 0);  
  47.     if (sClient == INVALID_SOCKET)  
  48.     {  
  49.         WSACleanup();  
  50.         printf("socket() failed!\n");  
  51.         return 0;  
  52.     }  
  53.     //构建服务器地址信息  
  54.     saServer.sin_family = AF_INET; //地址家族  
  55.     saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序  
  56.     saServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");  
  57.     //连接服务器  
  58.     ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));  
  59.     if (ret == SOCKET_ERROR)  
  60.     {  
  61.         printf("connect() failed!\n");  
  62.         closesocket(sClient); //关闭套接字  
  63.         WSACleanup();  
  64.         return 0;  
  65.     }  
  66.   
  67.     int nZero = 10;  
  68.     setsockopt(sClient, SOL_SOCKET, SO_SNDBUF, (char *)&nZero, sizeof(nZero));  
  69.     while (end > 0)  
  70.     {  
  71.         memset(data.sendMessage, '0'sizeof(data.sendMessage));  
  72.         fread(data.sendMessage, 1024, 1, fp);  
  73.         if (end >= 1024) //剩余很多信息  
  74.         {  
  75.             data.fin = 0;  
  76.             data.length = 1024;  
  77.         }  
  78.         else  
  79.         {  
  80.             data.fin = 1;  
  81.             data.length = end;  
  82.         }  
  83.         ret = send(sClient, (char *)&data, sizeof(struct Data), 0);  
  84.         if (ret == SOCKET_ERROR)  
  85.         {  
  86.             printf("send() failed!\n");  
  87.         }  
  88.         else  
  89.         {  
  90.             end -= 1024;  
  91.         }  
  92.     }  
  93.   
  94.     closesocket(sClient); //关闭套接字  
  95.     WSACleanup();  
  96.     return 0;  
  97. }  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值