導航:首頁 > 網路數據 > linuxsend發送大數據

linuxsend發送大數據

發布時間:2023-06-01 15:10:32

linux下socket的通信問題,如何讓SEND函數立刻發送數據

struct sockaddr_un address; // 這是24行
你寫錯字了,不是un,是in
正確寫法:
struct sockaddr_in address;

㈡ linux下C語言socket編程雙機互發數據

這個問題很好辦啦,伺服器接受一個連接請求,然後開一個線程或者進程都可以,再在線程或者進程裡面採用其他技術實現同時收發(比如I/O復用,比如非阻塞I/O)。客戶端也可以採用I/O復用。

推薦資料的話,《unix網路編程》這本書很好,公認的經典,當教科書用,這本書里有你想要的所有內容。

ps:你基礎太差,多補補吧,別想一下吃個胖子。

另外我這里正好有個例子滿足你的要求,貼給你,自己寫的,不是網上找的,用的是多進程加I/O復用技術:

server端:
/****************************************************************
**
**
**
****************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>

#define BUFLEN 1024
#define MAX(a,b) ((a)>(b)?(a):(b))

typedef void Sigfunc (int);

void str_echo(FILE *,int);
//Sigfunc *signal(int, Sigfunc *);

int main(int argc,char **argv)
{
int connfd,listenfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;
void sig_chld(int);

listenfd = socket(AF_INET, SOCK_STREAM, 0);

memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(5358);

bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
listen(listenfd,8);

signal(SIGCHLD,sig_chld);

while(1)
{
clilen = sizeof(cliaddr);
if((connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen)) < 0)
{
if(errno == EINTR)
{
fputs("accept error: EINTR\n",stdout);
continue;
}
else
{
fputs("accept error..\n",stdout);
}
}

if((childpid = fork()) == 0)
{
close(listenfd);
str_echo(stdin,connfd);
exit(0);
}
close(connfd);
}
}

void str_echo(FILE *fp,int sockfd)
{
int n = 0;
char sendbuf[BUFLEN] = { 0 },recvbuf[BUFLEN] = { 0 };
int maxfdp;
fd_set rset;

FD_ZERO(&rset);

while(1)
{
FD_SET(fileno(fp),&rset);
FD_SET(sockfd, &rset);
maxfdp = MAX(fileno(fp),sockfd)+1;

select(maxfdp, &rset ,NULL, NULL, NULL);

if(FD_ISSET(sockfd, &rset))
{
if(n = read(sockfd, recvbuf, BUFLEN) == 0)
{
return;
}
if(n == -1)
{
break;
}
printf("%s\n",recvbuf);
memset(recvbuf,0,BUFLEN);
}
if(FD_ISSET(fileno(fp),&rset))
{
scanf("%s",sendbuf);
write(sockfd, sendbuf,strlen(sendbuf));
}
}
}

void sig_chld (int signo)
{
pid_t pid;
int stat;

while ((pid = waitpid(-1,&stat, WNOHANG)) > 0)
{
printf("child %d terminated\n",pid);
}
return;
}

client端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>

#define MAX(a,b) (a)>(b)?(a):(b)

int main()
{
int s,connectReturn, maxfd;
fd_set rset;
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
long port=5358;
s=socket(PF_INET,SOCK_STREAM,0);

struct sockaddr_in sa;
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr("127.0.0.1");
sa.sin_port=htons(port);
connectReturn=connect(s,(struct sockaddr *)&sa,sizeof(sa));
printf("%d\n",connectReturn);
FD_ZERO(&rset);
while(1)
{
FD_SET(fileno(stdin), &rset);
FD_SET(s, &rset);
maxfd=MAX(fileno(stdin), s) + 1;

select(maxfd, &rset, NULL, NULL, NULL);
if(FD_ISSET(fileno(stdin), &rset))
{
scanf("%s",sendbuf);
send(s,sendbuf,strlen(sendbuf),0);
bzero(sendbuf, 1024);
}
else if(FD_ISSET(s, &rset))
{
memset(recvbuf,0,1024);
recv(s,recvbuf,1024,0);
printf("remote: %s\n",recvbuf);
}
}
return 0;
}

㈢ linux 網路編程 send 做了什麼操作

send解析
sockfd:指定發送端套接字描述符。
buff: 存放要發送數據的緩沖區
nbytes: 實際要改善的數據的位元組數
flags: 一般設置為0
1) send先比較發送數據的長度nbytes和套接字sockfd的發送緩沖區的長度,如果nbytes > 套接字sockfd的發送緩沖區的長度, 該函數返回SOCKET_ERROR;
2) 如果nbtyes <= 套接字sockfd的發送緩沖區的長度,那麼send先檢查協議是否正在發送sockfd的發送緩沖區中的數據,如果是就等待協議把數據發送完,如果協議還沒有開始發送sockfd的發送緩沖區中的數據或者sockfd的發送緩沖區中沒有數據,那麼send就比較sockfd的發送緩沖區的剩餘空間和nbytes
3) 如果 nbytes > 套接字sockfd的發送緩沖區剩餘空間的長度,send就一起等待協議把套接字sockfd的發送緩沖區中的數據發送完
4) 如果 nbytes < 套接字sockfd的發送緩沖區剩餘空間大小,send就僅僅把buf中的數據到剩餘空間里(注意並不是send把套接字sockfd的發送緩沖區中的數據傳到連接的另一端的,而是協議傳送的,send僅僅是把buf中的數據到套接字sockfd的發送緩沖區的剩餘空間里)。
5) 如果send函數成功,就返回實際的位元組數,如果send在數據時出現錯誤,那麼send就返回SOCKET_ERROR; 如果在等待協議傳送數據時網路斷開,send函數也返回SOCKET_ERROR。
6) send函數把buff中的數據成功到sockfd的改善緩沖區的剩餘空間後它就返回了,但是此時這些數據並不一定馬上被傳到連接的另一端。如果協議在後續的傳送過程中出現網路錯誤的話,那麼下一個socket函數就會返回SOCKET_ERROR。(每一個除send的socket函數在執行的最開始總要先等待套接字的發送緩沖區中的數據被協議傳遞完畢才能繼續,如果在等待時出現網路錯誤那麼該socket函數就返回SOCKET_ERROR)
7) 在unix系統下,如果send在等待協議傳送數據時網路斷開,調用send的進程會接收到一個SIGPIPE信號,進程對該信號的處理是進程終止。

㈣ linux send 最大可以發送多少

最大可以發送800M的
Linux系統滲嫌調用之send/sendto/sendmsg函數解析頃洞功能描述:發叢乎手送消息。

㈤ send的Linux C 函數

經套接字傳送消息
相關函數
sendto,sendmsg,recv,recvfrom,recvmsg,socket
表頭文件
#include < sys/socket.h >
定義函數
ssize_t send (int s,const void *msg,size_t len,int flags);
參數說明
第一個參數指定發送端套接字描述符;
第二個參數指明一個存放應用程式要發送數據的緩沖區;
第三個參數指明實際要發送的數據的字元數;
第四個參數一般置0。
函數說明
send() 用來將數據由指定的 socket 傳給對方主機。使用 send 時套接字必須已經連接。send 不包含傳送失敗的提示信息,如果檢測到本地錯誤將返回-1。因此,如果send 成功返回,並不必然表示連接另一端的進程接收數據。所保證的僅是當send 成功返回時,數據已經無錯誤地發送到網路上。
對於支持為報文設限的協議,如果單個報文超過協議所支持的最大尺寸,send 失敗並將 errno 設為 EMSGSIZE ;對於位元組流協議,send 會阻塞直到整個數據被傳輸。
flags 參數有如下的選擇:
MSG_DONTROUTE 勿將數據路由出本地網路
MSG_DONTWAIT 允許非阻塞操作(等價於使用O_NONBLOCK)
MSG_EOR 如果協議支持,此為記錄結束
MSG_OOB 如果協議支持,發送帶外數據
MSG_NOSIGNAL 禁止向系統發送異常信息
返回值
成功則返回實際傳送出去的字元數,失敗返回-1,錯誤原因存於errno 中。
錯誤代碼
EBADF 參數 s 非法的 socket 處理代碼。
EFAULT 參數中有一指針指向無法存取的內存空間。
WNOTSOCK 參數 s 為一文件描述詞,非 socket。
EINTR 被信號所中斷。
EAGAIN 此動作會令進程阻斷,但參數 s 的 socket 為不可阻斷的。
ENOBUFS 系統的緩沖內存不足。
EINVAL 傳給系統調用的參數不正確。

㈥ 請教linux下socket編程中send函數如何強制其將數據發出去

在多線程編程中其中使用一個線程來accept要連接的客戶端。同時在接受client的請求之後新建一回個線程來進行具體的操答作。其操作包括向client端發送一定位元組的數據,使用send()函數來進行操作。如果在發送過程中出現任何一個client端的斷線,則整個程序都會退出。
ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html

上面為send函數原型,在通常的使用中flags參數一般設置為0.此時如果客戶端斷開,繼續往裡邊寫數據的話,會引發一個信號SIGPIPE,此信號會引發線程的退出、
解決的方法:1)可以將flags參數設置為MSG_NOSIGNAL。2)設置SIG_IGN信號處理函數。

㈦ linux下send命令是干什麼用的

功能描述:
發送消息,send只可用於基於連接的套接字,send 和 write唯一的不同點是標志的存在,當標志為0時,send等同於write。sendto 和 sendmsg既可用於無連接的套接字,也可用於基於連接的套接字。除了套接字設置為非阻塞模式,調用將會阻塞直到數據被發送完。
參數:
sock:索引將要從其發送數據的套接字。
buf:指向將要發送數據的緩沖區。
len:以上緩沖區的長度。
flags:是以下零個或者多個標志的組合體,可通過or操作連在一起
MSG_DONTROUTE:不要使用網關來發送封包,只發送到直接聯網的主機。這個標志主要用於診斷或者路由程序。
MSG_DONTWAIT:操春喚作不會被阻塞。
MSG_EOR:終止一個記錄。
MSG_MORE:調用者有更多的數據需要發送。
MSG_NOSIGNAL:當告胡另一端終止連接時,請求在基於流的錯誤套襪森攔接字上不要發送SIGPIPE信號。
MSG_OOB:發送out-of-band數據(需要優先處理的數據),同時現行協議必須支持此種操作。
to:指向存放接收端地址的區域,可以為NULL。
tolen:以上內存區的長度,可以為0。

大數據開發工程師要掌握哪些技術

1. Java編程技術

Java編程技術是大數據學習的基礎塌並,Java是一種強類型語言,擁有極高的跨平台能力,可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等,是大數據工程師最喜歡的編程工具,因此,想學好大數據,掌握Java基礎是必不陵亮可少的。

2.Linux命令

對於大數據開發通常是在Linux環境下進行的,相比Linux操作系統,Windows操作系統是封閉的操作系統,開源的大數據軟體很受限制,因此,想從事大數據開發相關工作,還需掌握Linux基礎操作命令。

3. Hadoop

Hadoop是大數據開發的重要框架,其核心是HDFS和MapRece,HDFS為海量的數據提供了存儲,MapRece為海量的數據提供了計算,因此,需要重點掌握,除此之外,還需要掌握Hadoop集群、Hadoop集群管理、YARN以及Hadoop高級管理等相關技術與操作!

4. Hive

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapRece任務進行運行,十分適合數據倉庫的統尺衫寬計分析。對於Hive需掌握其安裝、應用及高級操作等。

5. Avro與Protobuf

Avro與Protobuf均是數據序列化系統,可以提供豐富的數據結構類型,十分適合做數據存儲,還可進行不同語言之間相互通信的數據交換格式,學習大數據,需掌握其具體用法。

6.ZooKeeper

ZooKeeper是Hadoop和Hbase的重要組件,是一個為分布式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分布式同步、組件服務等,在大數據開發中要掌握ZooKeeper的常用命令及功能的實現方法。

關於大數據開發工程師要掌握哪些技術,小編就和您分享到這里了。

㈨ linux手冊翻譯——send(2)


send, sendto, sendmsg - send a message on a socket


系統調用 send()、sendto() 和 sendmsg() 用於將消息傳輸到另一個套接字。

僅當套接字處於連接狀態時才可以使用 send() 調用(以便知道預期的接收者, 也就是說send()僅僅用於數據流類型的數據發送 ,對於TCP,服務端和客戶端都可以使用send/recv;但是對於UDP,只能是客戶端使用send/recv,服務端只能使用sendto/recvfrom,因為客戶端是進行了connect操作知道要發送和接受的地址)。send() 和 write(2) 之間的唯一滲衡區別是存在 flags 參數。此外,
send(sockfd, buf, len, flags);
等價於
sendto(sockfd, buf, len, flags, NULL, 0);

參數 sockfd 是發送者套接字的文件描述符。

如果在連接模式的套接字(即套接字類型為SOCK_STREAM、SOCK_SEQPACKET)上使用 sendto(),則參數 dest_addr 和 addrlen 將被忽略(當它們不是NULL和0時可能返回錯誤EISCONN),若套接字沒有實際連接(還沒有三次握手建立連接)將返回錯誤ENOTCONN。 否則,目標地址由 dest_addr 給出, addrlen 指定其大小。 對於 sendmsg(),目標地址由 msg.msg_name 給出, msg.msg_namelen 指定其大小。

對於 send() 和 sendto(),消息位於 buf 中,長度為 len 。 對於sendmsg(),消息存放於 msg.msg_iov 元素指向 數組數據區 (見下)中。 sendmsg() 調用還允許發送輔助數據(也稱為控制信息)

如果消息太長而無法通過底層協議原子傳遞( too long to pass atomically through the underlying protocol ),則返回錯誤 EMSGSIZE,並且不會傳輸消息。

No indication of failure to deliver is implicit in a send(). Locally detected errors are indicated by a return value of -1.

當消息轎陵不適合套接字的發送緩沖區時,send() 通常會阻塞,除非套接字已置於非阻塞 I/O 模式。 在這種情況下,在非阻塞模式下它會失敗並顯示錯誤 EAGAIN 或 EWOULDBLOCK。 select(2) 調用可用於確定何時可以發送更多數據

上面的的描述還是很籠統的,以TCP為例,按我的理解,我認為只要發送緩沖區有空閑位置,且此時協議棧沒有向網路發送數據,那麼就可以寫入,對於阻塞模式,直到所有數據寫入到緩沖區,就會返回,否則一直阻塞,對於非阻塞模式,是有一個超時時間的,這個由 SO_SNDTIMEO 選項控制,詳細見 socket(7) ,如果當前有空閑位置可以發即當前可寫入,那麼就寫入到緩沖區,知道超時之前寫入多少算多少,然後返回成功寫入的位元組數,如果超時時任何數據都沒寫出去,或者當前就是閉喊戚不可寫入,那麼返回-1 ,並設置errno為 EAGAIN 或 EWOULDBLOCK。

The flags argument is the bitwise OR of zero or more of the following flags.

sendmsg() 使用的 msghdr 結構的定義如下:

對於未連接的套接字 msg_name 指定數據報的目標地址,它指向一個包含地址的緩沖區; msg_namelen 欄位應設置為地址的大小。 對於連接的套接字,這些欄位應分別指定為 NULL 和 0。 這里的未連接指的是數據報協議,連接指的是數據流協議

The msg_iov and msg_iovlen fields specify scatter-gather locations, as for writev(2).
msg_iov是一個buffer數組:

使用 msg_control 和 msg_controllen 成員發送控制信息(輔助數據)。 內核可以處理的每個套接字最大控制緩沖區長度由 /proc/sys/net/core/optmem_max 中的值限制; 見 socket(7) 。 有關在各種套接字域中使用輔助數據的更多信息,請參閱 unix(7) 和 ip(7)。

msg_flags 欄位被忽略。


成功時,返回成功發送的位元組數,這個位元組數並不一定和我們的緩沖區大小相同 。 出錯時,返回 -1,並設置 errno 以指示錯誤。


這些是套接字層生成的一些標准錯誤。 底層協議模塊可能會產生和返回額外的錯誤; 請參閱它們各自的手冊頁。


4.4BSD, SVr4, POSIX.1-2001. These interfaces first appeared in 4.2BSD.

POSIX.1-2001 describes only the MSG_OOB and MSG_EOR flags. POSIX.1-2008 adds a specification of MSG_NOSIGNAL. The MSG_CONFIRM flag is a Linux extension.


根據 POSIX.1-2001,msghdr 結構的 msg_controllen 欄位應該是 socklen_t 類型,而 msg_iovlen 欄位應該是 int 類型,但是 glibc 目前將兩者都視為 size_t。

有關可用於在單個調用中傳輸多個數據報的 Linux 特定系統調用的信息,請參閱 sendmmsg(2)。

Linux may return EPIPE instead of ENOTCONN.


getaddrinfo(3) 中顯示了使用 send() 的示例。

㈩ socket linux c++ send()函數

給你一個代碼,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>

#defineMAXLINE4096//發送接受信息長度
#definePORT6666//埠

intmain(intargc,char**argv)
{
intsockfd,n;
charrecvline[MAXLINE],sendline[MAXLINE];
structsockaddr_inservaddr;

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

if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){//創建套接字,並未連接
printf("createsocketerror:%s(errno:%d) ",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_ptonerrorfor%s ",argv[1]);
exit(0);
}

//連接伺服器
if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){
printf("connecterror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

printf("sendmsgtoserver: ");
fgets(sendline,MAXLINE,stdin);//輸入向伺服器發送的信息

if(send(sockfd,sendline,strlen(sendline),0)<0)//向伺服器發送信息
{
printf("sendmsgerror:%s(errno:%d) ",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>

#defineMAXLINE4096
#definePORT6666

intmain(intargc,char**argv)
{
intlistenfd,connfd;
structsockaddr_inservaddr;
charbuff[MAXLINE];
intn;

if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){//創建套接字
printf("createsocketerror:%s(errno:%d) ",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,(structsockaddr*)&servaddr,sizeof(servaddr))==-1){
printf("bindsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

if(listen(listenfd,10)==-1){//開始監聽,最大請求數為10,可以自己設置
printf("listensocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

printf("======waitingforclient'srequest====== ");

while(1){
//建立通信,等待客戶端connect()函數的連接
if((connfd=accept(listenfd,(structsockaddr*)NULL,NULL))==-1)
{
printf("acceptsocketerror:%s(errno:%d)",strerror(errno),errno);
continue;
}
n=recv(connfd,buff,MAXLINE,0);//n可以判斷錯誤,此處可直接用recv()函數
//接收到的信息存放在buff中
buff[n]='';//添加結束符
printf("recvmsgfromclient:%s ",buff);
close(connfd);
}

close(listenfd);
}
閱讀全文

與linuxsend發送大數據相關的資料

熱點內容
word錄制新宏 瀏覽:939
官方航班app有哪些 瀏覽:836
jssubstring中文 瀏覽:463
讀取小米路由器文件 瀏覽:739
win10玩孤島驚魂4 瀏覽:844
微信jssdk配置 瀏覽:89
蘋果系統光碟機怎麼存儲文件 瀏覽:722
把文件夾發送 瀏覽:681
win7升級到專業版 瀏覽:282
qq飛車s車排行榜2017 瀏覽:671
揭示板網站怎麼看 瀏覽:202
ps文件轉換為ai文件嗎 瀏覽:695
蘋果升級到一半不動了 瀏覽:715
w7網路圖標怎麼設置 瀏覽:773
2016中國app應用創新峰會 瀏覽:680
用python寫聊天程序 瀏覽:818
安裝win10後是英文版 瀏覽:509
安卓支付寶停止運行怎麼辦 瀏覽:214
如何讓文件整理的好 瀏覽:58
電腦評標專家庫網站進不去怎麼辦 瀏覽:661

友情鏈接