网络编程C实现不定长传输数据与文本两个功能

本文介绍了使用C语言实现网络编程中服务端与客户端的通信,包括不定长数据和文本的传输。服务端通过recvvl和recvvlfile处理不定长数据和文本,客户端可以选择发送数据或文件。代码详细展示了如何处理数据接收和发送过程中的细节,如数据结束标志、错误处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务端与客户端进行通信,服务端实现不定长接收数据与文本。

recvvl是不定长处理数据

recv是定长处理数据

recvvlfile是不定长处理文本

recvfile是定长处理文本

服务端接收数据时,若遇见“#”代表接收结束,本次代码对文本名字进行单个字符的接收,若遇见“#”也表示接收文件名结束。

服务端:

#include "stdio.h"
//#include "windows.h"
#include "ws2tcpip.h"
#include "winsock2.h"

#pragma comment(lib,"Ws2_32.lib")
#define default_port "4444"

//定长数据
int recvn(SOCKET s,char *recvbuf,unsigned int fixedlen)
{
    int iResult;
    int cnt;
    cnt = fixedlen;
    int count=0;
    while(cnt>0)
    {
        iResult = recv(s,recvbuf,cnt,0);
        count++;
        if(iResult>0)
        {
            printf("%d--接收到的字节数:%d\n",count,iResult);
            for(int i=0;i<iResult;i++)
                if( recvbuf[iResult-1] != '#')
                    printf("%c",recvbuf[i]);
                else
                    exit(0);
            printf("\n");
            recvbuf += iResult;
            cnt -= iResult;
        }
        else if(iResult==0)
        {
            //printf("连接关闭5\n");
            return fixedlen-cnt;
        }
        else
        {
            printf("连接发生错误1\n");
            return -1;
        }

    }
    return fixedlen;
}

//recvnfile
int recvnfile(SOCKET s,char *recvbuf,unsigned int fixedlen,FILE *fp)
{
    int iResult;
    int cnt;
    cnt = fixedlen;
    int count=0;
    while(cnt>0)
    {
        iResult = recv(s,recvbuf,cnt,0);
        count++;
        if(iResult>0)
        {
            fwrite(recvbuf,sizeof(char),iResult,fp);
            recvbuf += iResult;
            cnt -= iResult;
        }
        else if(iResult==0)
        {
            //printf("连接关闭5\n");
            return fixedlen-cnt;
        }
        else
        {
            printf("连接发生错误1\n");
            return -1;
        }

    }
    return fixedlen;
}

//变长数据接收
int recvvl(SOCKET s,char *recvbuf, unsigned int recvbuflen)
{
    int iResult;//存储单次recv操作的返回值
    unsigned int reclen; //用于存储消息首部存储的长度信息
    iResult = recvn(s,(char *)&reclen,sizeof(unsigned int));
    if(iResult != sizeof(unsigned int))
    {
        if(iResult == -1)
        {
            printf("接收发生错误2");
            return -1;
        }
        else
        {
            printf("连接关闭4");
            r

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值