socket linux c++ send()函数
问题就是在linux下c++用socket通信使用send函数发送数据如何发送超大数据大小有1~2G正常发送100+M数据都没问题上G就不行了??怎么解决求解释求代码谢谢...
问题就是在linux下c++用socket通信 使用send函数发送数据 如何发送超大数据大小有1~2G 正常发送100+M数据都没问题 上G就不行了?? 怎么解决 求解释 求代码 谢谢各位了
展开
4个回答
展开全部
给你一个代码,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);
}
展开全部
怎么个不行法?你调用send函数,网络底层会自动按照你所指定的发送窗口大小来分包,所以一般也可以发送成功的,只不过 如果自己不在网络层组织数据包的话,效率会有问题。
更多追问追答
追问
还真不行 到了send函数就停了 百来M可以
追答
你的socket是不是用的阻塞式的?如果是的话,当然就有可能就卡在send函数那了,但是这是正常的,因为TCP需要保证所有的数据都已完整、正确的发送了。你只需要等send函数正常返回即可,或者改为非阻塞式的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不要一次发送,分成多次发送
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 ;
}
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 什么?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是不是你的发送缓存分配的有问题?(直接分配上G的缓存了?)
贴几行代码看看:
1.缓存分配,及数据读入
2.发送过程
贴几行代码看看:
1.缓存分配,及数据读入
2.发送过程
追问
是发送次数问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询