當前位置:首頁 » 操作系統 » linuxsocketsend

linuxsocketsend

發布時間: 2024-12-31 05:21:55

❶ 在線求助,linux 網路socket 高密度send 發送失敗

在linux的網路編程,特別是TCP的編程中,SIGPIPE信號錯誤是一個比較常見的問題,我猜測你是在使用TCP的socket吧,如果是這樣的話,很有可能是你在向一個已經處於關閉狀態的socket寫數據,因為TCP是面向連接的協議。如果對方將socket給close掉了,而你還繼續往這個 socket寫數據,就會觸發這個信號。 因此,建議你在write之前檢查一下對方是否已經close掉了這個socket。 如果回答得不對,可以繼續追問哈

❷ 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);
}

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

功能描述:
發送消息,send只可用於基於連接的套接字,send

write唯一的不同點是標志的存在,當標志為0時,send等同於write。sendto

sendmsg既可用於無連接的套接字,也可用於基於連接的套接字。除了套接字設置為非阻塞模式,調用將會阻塞直到數據被發送完。
用法:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sock, const void *buf, size_t len, int flags);
ssize_t sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
ssize_t sendmsg(int sock, const struct msghdr *msg, int flags);參數:
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。

❹ 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 網路編程 sendto 問題

sendto(經socket傳送數據)
相關函數 send , sendmsg,recv , recvfrom , socket

表頭文件 #include < sys/types.h >
#include < sys/socket.h >

定義函數 int sendto ( int s , const void * msg, int len, unsigned int flags, const
struct sockaddr * to , int tolen ) ;

函數說明 sendto() 用來將數據由指定的socket傳給對方主機。參數s為已建好連線的socket,如果利用UDP協議則不需經過連線操作。參數msg指向欲連線的數據內容,參數flags 一般設0,詳細描述請參考send()。參數to用來指定欲傳送的網路地址,結構sockaddr請參考bind()。參數tolen為sockaddr的結果長度。

返回值 成功則返回實際傳送出去的字元數,失敗返回-1,錯誤原因存於errno 中。

錯誤代碼 EBADF 參數s非法的socket處理代碼。
EFAULT 參數中有一指針指向無法存取的內存空間。
WNOTSOCK canshu s為一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此動作會令進程阻斷,但參數s的soket為補課阻斷的。
ENOBUFS 系統的緩沖內存不足。
EINVAL 傳給系統調用的參數不正確。

範例 #include < sys/types.h >
#include < sys/socket.h >
# include <netinet.in.h>
#include <arpa.inet.h>
#define PORT 2345 /*使用的port*/
main(){
int sockfd,len;
struct sockaddr_in addr;
char buffer[256];
/*建立socket*/
if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){
perror (「socket」);
exit(1);
}
/*填寫sockaddr_in 結構*/
bzero ( &addr, sizeof(addr) );
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr=hton1(INADDR_ANY) ;
if (bind(sockfd, &addr, sizeof(addr))<0){
perror(「connect」);
exit(1);
}
while(1){
bezro(buffer,sizeof(buffer));
len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len);
/*顯示client端的網路地址*/
printf(「receive from %s\n 「 , inet_ntoa( addr.sin_addr));
/*將字串返回給client端*/
sendto(sockfd,buffer,len,0,&addr,addr_len);」
}
}

熱點內容
linux通配符文件夾 發布:2025-01-03 02:24:34 瀏覽:663
ftp路由埠映射 發布:2025-01-03 02:24:29 瀏覽:123
密碼本的鎖頭在哪裡買 發布:2025-01-03 02:23:52 瀏覽:567
解壓錯誤報告 發布:2025-01-03 02:18:51 瀏覽:582
android的源代碼下載 發布:2025-01-03 02:17:53 瀏覽:994
夢幻西遊可轉入伺服器什麼意思 發布:2025-01-03 02:13:03 瀏覽:123
pythonsort參數 發布:2025-01-03 02:12:28 瀏覽:105
java銀行系統 發布:2025-01-03 02:11:42 瀏覽:784
收卡網源碼 發布:2025-01-03 02:01:37 瀏覽:352
usb存儲灰色的 發布:2025-01-03 01:58:34 瀏覽:699