日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Linux下send、sendto、sendmsg函數(shù)分析

 積累ing 2012-08-30

MSG_DONTROUTE:不要使用網(wǎng)關(guān)來發(fā)送封包,只發(fā)送到直接聯(lián)網(wǎng)的主機(jī)。這個標(biāo)志主要用于診斷或者路由程序。
MSG_DONTWAIT:操作不會被阻塞。
MSG_EOR:終止一個記錄。
MSG_MORE:調(diào)用者有更多的數(shù)據(jù)需要發(fā)送。
MSG_NOSIGNAL:當(dāng)另一端終止連接時,請求在基于流的錯誤套接字上不要發(fā)送SIGPIPE信號。
MSG_OOB:發(fā)送out-of-band數(shù)據(jù)(需要優(yōu)先處理的數(shù)據(jù)),同時現(xiàn)行協(xié)議必須支持此種操作。

to:指向存放接收端地址的區(qū)域,可以為NULL。
tolen:以上內(nèi)存區(qū)的長度,可以為0。
msg:指向存放發(fā)送消息頭的內(nèi)存緩沖,結(jié)構(gòu)形態(tài)如下

struct msghdr {
    void         *msg_name;     


 

    socklen_t     msg_namelen;  
    struct iovec *msg_iov;      
    size_t        msg_iovlen;   
    void         *msg_control;  
    socklen_t     msg_controllen;
    int           msg_flags;    
};


可能用到的數(shù)據(jù)結(jié)構(gòu)有

struct cmsghdr {
    socklen_t cmsg_len;   
    int       cmsg_level; 
    int       cmsg_type;  
  
};
返回說明: 
成功執(zhí)行時,返回已發(fā)送的字節(jié)數(shù)。失敗返回-1,errno被設(shè)為以下的某個值 
EACCES:對于Unix域套接字,不允許對目標(biāo)套接字文件進(jìn)行寫,或者路徑前驅(qū)的一個目錄節(jié)點(diǎn)不可搜索
EAGAIN,EWOULDBLOCK: 套接字已標(biāo)記為非阻塞,而發(fā)送操作被阻塞
EBADF:sock不是有效的描述詞
ECONNRESET:連接被用戶重置
EDESTADDRREQ:套接字不處于連接模式,沒有指定對端地址
EFAULT:內(nèi)存空間訪問出錯
EINTR:操作被信號中斷
EINVAL:參數(shù)無效
EISCONN:基于連接的套接字已被連接上,同時指定接收對象
EMSGSIZE:消息太大
ENOMEM:內(nèi)存不足
ENOTCONN:套接字尚未連接,目標(biāo)沒有給出
ENOTSOCK:sock索引的不是套接字
EPIPE:本地連接已關(guān)閉

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
void Recv()
{
   struct sockaddr_in serv_addr;
   int sock_fd;
   char line[15] = "Hello world!";
   int size = 13;
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
   serv_addr.sin_port = htons(5000);
   sock_fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
   send(sock_fd, line, size, 0);
   close(sock_fd);
}


#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
void Sendto()
{
   sockaddr_in receiver_addr;
   int sock_fd;
   char line[15] = "Hello World!";
   sock_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
   receiver_addr.sin_family = AF_INET;
   receiver_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
   receiver_addr.sin_port = htons(5000);
   sendto(sock_fd, line, 13, 0,(struct sockaddr*)&receiver_addr,sizeof(receiver_addr));
   close(sock_fd);
}


#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
void sendmsg()
{
   struct sockaddr_in receiver_addr;
   int sock_fd;
   char line[15] = "Hello World!";
   struct msghdr msg;
   struct iovec iov;
   sock_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
 
   receiver_addr.sin_family = AF_INET;
   receiver_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
   receiver_addr.sin_port = htons(5000);
   msg.msg_name = &receiver_addr;
   msg.msg_namelen = sizeof(receiver_addr);
   msg.msg_iov = &iov;
   msg.msg_iovlen = 1;
   msg.msg_iov->iov_base = line;
   msg.msg_iov->iov_len = 13;
   msg.msg_control = 0;
   msg.msg_controllen = 0;
   msg.msg_flags = 0;
   sendmsg(sock_fd,&msg,0);
   close(sock_fd);
}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多