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

服务器端

[cpp] view plain copy print?
#include <stdio.h>  
#include <winsock2.h>  
#include <winsock2.h>  
#define SERVER_PORT 9210 //侦听端口  
#pragma comment(lib,"ws2_32.lib")  

struct Data //数据包  
{  
    int length;  
    char receivemessage[2000]; //内容信息  
    int fin;  
}data;  

int main()  
{  
    FILE * fp;  
    if (!(fp = fopen("abc.jpg", "wb+")))  
    {  
        printf("open abc.jpg error");  
        exit(0);  
    }  
    WORD wVersionRequested;//双字节;高字节存取副版本号,低字节存取高版本号。  
    WSADATA wsaData;//存取套接字实现的具体信息  
    int ret,  length;  
    SOCKET sListen, sServer; //侦听套接字,连接套接字  
    struct sockaddr_in saServer, saClient; //地址信息    

    //WinSock初始化  
    wVersionRequested = MAKEWORD(2, 2);   
    ret = WSAStartup(wVersionRequested, &wsaData);   
    if (ret != 0)  
    {  
        printf("WSAStartup() failed!\n");  
        return 0;  
    }  
    //创建Socket,使用TCP协议  
    sListen = socket(AF_INET, SOCK_STREAM, 0);  
    if (sListen == INVALID_SOCKET)  
    {  
        WSACleanup();  
        printf("socket() faild!\n");  
        return 0;  
    }  
    //构建本地地址信息  
    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 0;  
    }  

    //侦听连接请求  
    ret = listen(sListen, 5);  
    if (ret == SOCKET_ERROR)  
    {  
        printf("listen() faild! code:%d\n", WSAGetLastError());  
        closesocket(sListen); //关闭套接字  
        return 0;  
    }  

    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 0;  
    }  

    //阻塞等待接受客户端连接  
    while (!data.fin)  
    {  
        memset(data.receivemessage, '0', sizeof(data.receivemessage));  
        ret = recv(sServer, (char *)&data, sizeof(struct Data), 0);  //第二个参数使用强制类型,为一个数据包  
        if (ret == SOCKET_ERROR)  
        {  
            printf("recv() failed!\n");  
            return 0;  
        }  
        if (ret == 0) //客户端已经关闭连接  
        {  
            printf("Client has closed the connection\n");  
            break;  
        }  
        fwrite(data.receivemessage, data.length, 1, fp);  
    }  

      closesocket(sListen);  
      closesocket(sServer);  
      WSACleanup();  
    return 0;  
}  

客户端

[cpp] view plain copy print?
#define _WINSOCK_DEPRECATED_NO_WARNINGS  
#include <stdio.h>  
#include <stdlib.h>  
#include <winsock2.h>  
#define SERVER_PORT 9210 //侦听端口  
#pragma comment(lib,"ws2_32.lib")  

struct Data  
{  
    int length;  
    char sendMessage[2000];  
    int fin;  
}data;  

int main()  
{  
    FILE * fp;  
    errno_t err = fopen_s(&fp, "D:\\7.jpg", "rb+");  
    WORD wVersionRequested;  
    WSADATA wsaData;  
    int ret;  
    SOCKET sClient; //连接套接字  
    struct sockaddr_in saServer; //地址信息  

    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 0;  
    }  
    //确认WinSock DLL支持版本2.2  
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)  
    {  
        WSACleanup();  
        printf("Invalid WinSock version!\n");  
        return 0;  
    }  
    //创建Socket,使用TCP协议  
    sClient = socket(AF_INET, SOCK_STREAM, 0);  
    if (sClient == INVALID_SOCKET)  
    {  
        WSACleanup();  
        printf("socket() failed!\n");  
        return 0;  
    }  
    //构建服务器地址信息  
    saServer.sin_family = AF_INET; //地址家族  
    saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序  
    saServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");  
    //连接服务器  
    ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));  
    if (ret == SOCKET_ERROR)  
    {  
        printf("connect() failed!\n");  
        closesocket(sClient); //关闭套接字  
        WSACleanup();  
        return 0;  
    }  

    int nZero = 10;  
    setsockopt(sClient, SOL_SOCKET, SO_SNDBUF, (char *)&nZero, sizeof(nZero));  
    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;  
        }  
        ret = send(sClient, (char *)&data, sizeof(struct Data), 0);  
        if (ret == SOCKET_ERROR)  
        {  
            printf("send() failed!\n");  
        }  
        else  
        {  
            end -= 1024;  
        }  
    }  

    closesocket(sClient); //关闭套接字  
    WSACleanup();  
    return 0;  
}  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows环境下,你可以使用C语言的socket编程来实现文件传输。下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") // 链接ws2_32.lib库 #define BUFFER_SIZE 1024 int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to initialize winsock.\n"); return -1; } // 创建服务端socket SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == INVALID_SOCKET) { printf("Failed to create socket.\n"); WSACleanup(); return -1; } // 设置服务端地址和端口 struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(12345); // 绑定服务端socket到地址和端口 if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { printf("Failed to bind socket.\n"); closesocket(serverSocket); WSACleanup(); return -1; } // 监听连接请求 if (listen(serverSocket, 5) == SOCKET_ERROR) { printf("Failed to listen on socket.\n"); closesocket(serverSocket); WSACleanup(); return -1; } printf("Waiting for client connection...\n"); // 接受客户端连接 struct sockaddr_in clientAddr; int addrLen = sizeof(clientAddr); SOCKET clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &addrLen); if (clientSocket == INVALID_SOCKET) { printf("Failed to accept client connection.\n"); closesocket(serverSocket); WSACleanup(); return -1; } printf("Client connected.\n"); // 打开要传输的文件 FILE* file = fopen("file.txt", "rb"); if (file == NULL) { printf("Failed to open file.\n"); closesocket(clientSocket); closesocket(serverSocket); WSACleanup(); return -1; } // 读取文件内容并发送 char buffer[BUFFER_SIZE]; int bytesRead; while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file)) > 0) { if (send(clientSocket, buffer, bytesRead, 0) == SOCKET_ERROR) { printf("Failed to send file.\n"); fclose(file); closesocket(clientSocket); closesocket(serverSocket); WSACleanup(); return -1; } } // 关闭文件和socket fclose(file); closesocket(clientSocket); closesocket(serverSocket); WSACleanup(); printf("File sent successfully.\n"); return 0; } ``` 上述代码演示了一个简单的服务端程序,它会监听特定端口上的连接请求,并将文件内容发送给客户端。你可以将要传输的文件命名为"file.txt",并放在与代码文件相同的目录下。 请注意,上述代码仅提供了一个基本的示例,可能还需要进行错误处理和异常情况处理等。此外,你还需要在客户端编写相应的代码来接收文件内容并保存到本地磁盘上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值