socket linux c++ send()函数

问题就是在linux下c++用socket通信使用send函数发送数据如何发送超大数据大小有1~2G正常发送100+M数据都没问题上G就不行了??怎么解决求解释求代码谢谢... 问题就是在linux下c++用socket通信 使用send函数发送数据 如何发送超大数据大小有1~2G 正常发送100+M数据都没问题 上G就不行了?? 怎么解决 求解释 求代码 谢谢各位了 展开
 我来答
星陨Rmte
推荐于2016-06-13 · 超过39用户采纳过TA的回答
知道小有建树答主
回答量:68
采纳率:0%
帮助的人:29.2万
展开全部

给你一个代码,linux下编译运行即可,做了简单的注释,client.c如下:

send()函数在client.c末尾

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 4096 //发送接受信息长度
#define PORT 6666   //端口 

int main(int argc, char** argv)
{
    int    sockfd, n;
    char    recvline[MAXLINE], sendline[MAXLINE];
    struct sockaddr_in    servaddr;

    if( argc != 2){
    printf("usage: ./client <ipaddress>\n");  //使用方法
    exit(0);
    }

    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){   //创建套接字,并未连接
    printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
    exit(0);
    }

   
    //memset(结构体地址,清零,要清零的长度);清零结构体servaddr,将结构体数据全部设置为0
//同bzero(结构体地址,要清理的长度);默认清零
    memset(&servaddr, 0, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;   //sa_family是通信类型,最常用的值是 "AF_INET"
    servaddr.sin_port = htons(PORT); //端口号

//servaddr.sin_addr.s_addr=inet_addr(argv[1]); //服务器IP,如下功能相同
if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
    printf("inet_pton error for %s\n",argv[1]);
    exit(0);
    }

    //连接服务器
    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){  
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    printf("send msg to server: \n");
    fgets(sendline, MAXLINE, stdin);  //输入向服务器发送的信息

    if( send(sockfd, sendline, strlen(sendline), 0) < 0)  //向服务器发送信息
    {
    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
    exit(0);
    }

    close(sockfd); //关闭套接字
    exit(0);
}

服务器程序:server.c如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 4096
#define PORT 6666

int main(int argc, char** argv)
{
    int    listenfd, connfd;
    struct sockaddr_in     servaddr;
    char    buff[MAXLINE];
    int     n;

    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  //创建套接字
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    memset(&servaddr, 0, sizeof(servaddr));//结构体清零
    servaddr.sin_family = AF_INET;  //sa_family是通信类型,最常用的值是 "AF_INET"
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  //指定接受任何连接
    servaddr.sin_port = htons(PORT); //监听端口

//给套接口绑定地址
    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    if( listen(listenfd, 10) == -1){   //开始监听,最大请求数为10,可以自己设置
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    printf("======waiting for client's request======\n");

    while(1){
  //建立通信,等待客户端connect()函数的连接
      if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
  {
         printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
         continue;
      }
      n = recv(connfd, buff, MAXLINE, 0);  //n可以判断错误,此处可直接用recv()函数
                                       //接收到的信息存放在buff中
      buff[n] = '\0';  //添加结束符
      printf("recv msg from client: %s\n", buff);
      close(connfd);
    }

    close(listenfd);
}
wangluoqingfen
2013-03-05
知道答主
回答量:8
采纳率:0%
帮助的人:3.4万
展开全部
怎么个不行法?你调用send函数,网络底层会自动按照你所指定的发送窗口大小来分包,所以一般也可以发送成功的,只不过 如果自己不在网络层组织数据包的话,效率会有问题。
更多追问追答
追问
还真不行  到了send函数就停了  百来M可以
追答
你的socket是不是用的阻塞式的?如果是的话,当然就有可能就卡在send函数那了,但是这是正常的,因为TCP需要保证所有的数据都已完整、正确的发送了。你只需要等send函数正常返回即可,或者改为非阻塞式的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kaixingui2012
推荐于2016-01-11 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6266万
展开全部
不要一次发送,分成多次发送
int sendbuf(int socket, char *buffer , int sendlen )
{
int len=0;
int one=1024 ;
do
{
if ( sendlen-len > 1024 )

one=1024;
else
one=sendlen-len ;
send(socket, buffer, one , 0);
len += one ;
buffer += one ;
}while ( len < sendlen ) ;
return len ;
}
追问
还是不行到了send处函数就停了  还有buffer =one  什么?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
卖萌犯法
2013-03-05 · 超过31用户采纳过TA的回答
知道答主
回答量:126
采纳率:0%
帮助的人:73.5万
展开全部
是不是你的发送缓存分配的有问题?(直接分配上G的缓存了?)
贴几行代码看看:
1.缓存分配,及数据读入
2.发送过程
追问
是发送次数问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式