青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計

最新評論

MSG_PARTIAL 選項解釋(畫----的那部分)

Connectionless Communication
Connectionless communication behaves differently than connection-oriented communication, so the method for sending and receiving data is substantially different. First we'll discuss the receiver (or server, if you prefer) because the connectionless 
receiver requires little change when compared with the connection-oriented servers. After that we'll look at the sender.

In IP, connectionless communication is accomplished through UDP/IP. UDP doesn't guarantee reliable data transmission and is capable of sending data to multiple destinations and receiving it from multiple sources. For example, if a client sends data to 
a server, the data is transmitted immediately regardless of whether the server is ready to receive it. If the server receives data from the client, it doesn't acknowledge the receipt. Data is transmitted using datagrams, which are discrete message 
packets.

Receiver
The steps in the process of receiving data on a connectionless socket are simple. First, create the socket with either socket or WSASocket. Next, bind the socket to the interface on which you wish to receive data. This is done with the bind function 
(exactly like the session-oriented example). The difference with connectionless sockets is that you do not call listen or accept. Instead, you simply wait to receive the incoming data. Because there is no connection, the receiving socket can receive 
datagrams originating from any machine on the network. The simplest of the receive functions is recvfrom, which is defined as

int recvfrom(
    SOCKET s,
    char FAR* buf,
    int len,
    int flags,
    struct sockaddr FAR* from,
    int FAR* fromlen
);
The first four parameters are the same as recv, including the possible values for flags: MSG_OOB and MSG_PEEK. The same warnings for using the MSG_PEEK flag also apply to connectionless sockets. The from parameter is a SOCKADDR structure for the given 
protocol of the listening socket, with fromlen pointing to the size of the address structure. When the API call returns with data, the SOCKADDR structure is filled with the address of the workstation that sent the data.

The Winsock 2 version of the recvfrom function is WSARecvFrom. The prototype for this function is

int WSARecvFrom(
    SOCKET s,
    LPWSABUF lpBuffers,
    DWORD dwBufferCount,
    LPDWORD lpNumberOfBytesRecvd,
    LPDWORD lpFlags,
    struct sockaddr FAR * lpFrom,
    LPINT lpFromlen,
    LPWSAOVERLAPPED lpOverlapped,
    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
The difference is the use of WSABUF structures for receiving the data. You can supply one or more WSABUF buffers to WSARecvFrom with dwBufferCount indicating this. By supplying multiple buffers, scatter-gather I/O is possible. The total number of bytes 
read is returned in lpNumberOfBytesRecvd. When you call WSARecvFrom, the lpFlags parameter can be 0 for no options, MSG_OOB, MSG_PEEK, or MSG_PARTIAL. These flags can be bitwise OR together. If MSG_PARTIAL is specified when the function is called, the 
provider knows to return data even if only a partial message has been received. Upon return, the flag MSG_PARTIAL is set if only a partial message was received. Upon return, WSARecvFrom will store the address of the sending machine in the lpFrom 
parameter (a pointer to a SOCKADDR structure). Again, lpFromLen points to the size of the SOCKADDR structure, except that in this function it is a pointer to a DWORD. The last two parameters, lpOverlapped and lpCompletionRoutine, are used for 
overlapped I/O (which we'll discuss in Chapter 5).

Another method of receiving (and sending) data on a connectionless socket is to establish a connection. This might seem strange, but it's not quite what it sounds like. Once a connectionless socket is created, you can call connect or WSAConnect with 
the SOCKADDR parameter set to the address of the remote machine to communicate with. No actual connection is made, however. The socket address passed into a connect function is associated with the socket so recv and WSARecv can be used instead of 
recvfrom or WSARecvFrom because the data's origin is known. The capability to connect a datagram socket is handy if you intend to communicate with only one endpoint at a time in your application.

The following code sample demonstrates how to construct a simple UDP receiver application. You will find a complete version of this application in a file named UDPRECEIVER on the companion CD.

#include <winsock2.h>

void main(void)
{
   WSADATA              wsaData;
   SOCKET               ReceivingSocket;
   SOCKADDR_IN          ReceiverAddr;
   int                  Port = 5150;
   char                 ReceiveBuf[1024];
   int                  BufLength = 1024;
   SOCKADDR_IN          SenderAddr;
   int                  SenderAddrSize = sizeof(SenderAddr);
   
   // Initialize Winsock version 2.2

   WSAStartup(MAKEWORD(2,2), &wsaData);
   
      // Create a new socket to receive datagrams on.
 
      ReceivingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

      // Set up a SOCKADDR_IN structure that will tell bind that we
      // want to receive datagrams from all interfaces using port
      // 5150.

      ReceiverAddr.sin_family = AF_INET;
      ReceiverAddr.sin_port = htons(Port);    
      ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

      // Associate the address information with the socket using bind.

      bind(ReceivingSocket, (SOCKADDR *)&SenderAddr, sizeof(SenderAddr));

   // At this point you can receive datagrams on your bound socket.
   recvfrom(ReceivingSocket, ReceiveBuf, BufLength, 0,
            (SOCKADDR *)&SenderAddr, &SenderAddrSize);

   // When your application is finished receiving datagrams close
   // the socket.

   closesocket(ReceivingSocket);

   // When your application is finished call WSACleanup.

   WSACleanup();
}
Now that you understand how to construct a receiver that can receive a datagram, we will describe how to construct a sender.

Sender
There are two options to send data on a connectionless socket. The first, and simplest, is to create a socket and call either sendto or WSASendTo. We'll cover sendto first, which is defined as

int sendto(
    SOCKET s,
    const char FAR * buf,
    int len,
    int flags,
    const struct sockaddr FAR * to,
    int tolen
);
The parameters are the same as recvfrom except that buf is the buffer of data to send and len indicates how many bytes to send. Also, the to parameter is a pointer to a SOCKADDR structure with the destination address of the workstation to receive the 
data. The Winsock 2 function WSASendTo can also be used. This function is defined as

int WSASendTo(
    SOCKET s,                                               
    LPWSABUF lpBuffers,                                     
    DWORD dwBufferCount,                                    
    LPDWORD lpNumberOfBytesSent,                            
    DWORD dwFlags,                                          
    const struct sockaddr FAR * lpTo,                       
    int iToLen,                                             
    LPWSAOVERLAPPED lpOverlapped,                           
    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
Again, WSASendTo is similar to its ancestor. This function takes a pointer to one or more WSABUF structures with data to send to the recipient as the lpBuffers parameter, with dwBufferCount indicating how many structures are present. You can send 
multiple WSABUF structures to enable scatter-gather I/O. Before returning, WSASendTo sets the fourth parameter, lpNumberOfBytesSent, to the number of bytes actually sent to the receiver. The lpTo parameter is a SOCKADDR structure for the given 
protocol, with the recipient's address. The iToLen parameter is the length of the SOCKADDR structure. The last two parameters, lpOverlapped and lpCompletionRoutine, are used for overlapped I/O (discussed in Chapter 5).

As with receiving data, a connectionless socket can be connected to an endpoint address and data can be sent with send and WSASend. Once this association is established, you cannot go back to using sendto or WSASendTo with an address other than the 
address passed to one of the connect functions. If you attempt to send data to a different address, the call will fail with WSAEISCONN. The only way to disassociate the socket handle from that destination is to call connect with the destination address 
of INADDR_ANY.

The following code sample demonstrates how to construct a simple UDP sender application. You will find a complete version of this application on the companion CD in a file named UDPSENDER.

#include <winsock2.h>

void main(void)
{
   WSADATA              wsaData;
   SOCKET               SendingSocket;
   SOCKADDR_IN          ReceiverAddr;
   int                  Port = 5150;
   char                 SendBuf[1024];
   int                  BufLength = 1024;

   // Initialize Winsock version 2.2

   WSAStartup(MAKEWORD(2,2), &wsaData);
   
   // Create a new socket to receive datagrams on.
 
   SendingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
   
   // Set up a SOCKADDR_IN structure that will identify who we
   // will send datagrams to. For demonstration purposes, let's
   // assume our receiver's IP address is 136.149.3.29 and waits
   // for datagrams on port 5150.

   ReceiverAddr.sin_family = AF_INET;
   ReceiverAddr.sin_port = htons(Port);    
   ReceiverAddr.sin_addr.s_addr = inet_addr("136.149.3.29");

   // Send a datagram to the receiver.

   sendto(SendingSocket, SendBuf, BufLength, 0, 
          (SOCKADDR *)&ReceiverAddr, sizeof(RecieverAddr));
          
   // When your application is finished sending datagrams close
   // the socket.

   closesocket(SendingSocket);

   // When your application is finished call WSACleanup.

   WSACleanup();
}
Message-Based Protocols
Just as most connection-oriented communication is also streaming, connectionless communication is almost always message-based. Thus, there are some considerations when you're sending and receiving data. First, because message-based protocols preserve 
data boundaries, data submitted to a send function blocks until completed. For non-blocking I/O modes, if a send cannot be completely satisfied, the send function returns with the error WSAEWOULDBLOCK. This means that the underlying system was not able 
to process that data and you should attempt the send call again at a later time. This scenario will be discussed in greater detail in Chapter 5. The main point to remember is that with message-based protocols, the write can occur as an autonomous 
action only.

---------------------------------------
On the flip side, a call to a receive function must supply a sufficiently large buffer. If the supplied buffer is not large enough, the receive call fails with the error WSAEMSGSIZE. If this occurs, the buffer is filled to its capacity, but the 
remaining data is discarded. The truncated data cannot be retrieved. The only exception is for protocols that do support partial messages, such as the AppleTalk PAP protocol. Prior to returning, the WSARecv, WSARecvEx, or WSARecvFrom functions set the 
in-out flag parameter to MSG_PARTIAL when it receives only part of a message.
---------------------------------------


For datagrams based on protocols supporting partial messages, consider using one of the WSARecv* functions because when you make a call to recv/recvfrom, there is no notification that the data read is only a partial message. It is up to the programmer 
to implement a method for the receiver to determine if the entire message has been read. Subsequent calls to recv/recvfrom return other pieces of the datagram. Because of this limitation, it can be convenient to use the WSARecvEx function, which allows 
the setting and reading of the MSG_PARTIAL flag to indicate if the entire message was read. The Winsock 2 functions WSARecv and WSARecvFrom also support this flag. See the descriptions for WSARecv, WSARecvEx, and WSARecvFrom for additional information 
about this flag.

Finally, let's take a look at one of the more frequently asked questions about sending UDP/IP messages on machines with multiple network interfaces: What happens when a UDP socket is bound explicitly to a local IP interface and datagrams are sent? With 
UDP sockets, you don't really bind to the network interface; you create an association whereby the IP interface that is bound becomes the source IP address of UDP datagrams sent. The routing table actually determines which physical interface the 
datagram is transmitted on. If you do not call bind but instead use either sendto/WSASendTo or perform a connect first, the network stack automatically picks the best local IP address based on the routing table. So if you explicitly bind first, the 
source IP address could be incorrect. That is, the source IP might not be the IP address of the interface on which the datagram was actually sent.

Releasing Socket Resources
Because there is no connection with connectionless protocols, there is no formal shutdown or graceful closing of the connection. When the sender or the receiver is finished sending or receiving data, it simply calls the closesocket function on the 
socket handle. This releases any associated resources allocated to the socket.

posted on 2008-05-07 09:45 大龍 閱讀(1646) 評論(1)  編輯 收藏 引用

評論

# re: MSG_PARTIAL 選項解釋(畫----的那部分) 2011-08-30 14:57 QVOD

很有幫助!  回復  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久夜色精品国产欧美乱| 久久久91精品国产一区二区精品| 国产亚洲精品bv在线观看| 欧美激情中文字幕在线| 国产伦精品一区二区三区在线观看| 亚洲国产精品一区二区第四页av| 国产免费亚洲高清| 一本色道久久综合亚洲精品婷婷| 亚洲国产精品成人综合| 欧美怡红院视频| 性欧美video另类hd性玩具| 欧美日韩亚洲激情| 亚洲国产免费| 亚洲激情视频在线播放| 久久久久久免费| 欧美在线你懂的| 国产伦精品一区二区三区照片91| 一本久道久久综合中文字幕| 亚洲每日更新| 欧美精品一区二区三区很污很色的 | 久久av资源网站| 久久不射电影网| 国产欧美在线看| 午夜精品久久久久久久男人的天堂| 午夜精品999| 国产精品夜夜嗨| 亚洲影院色在线观看免费| 午夜久久久久久| 国产午夜精品一区二区三区欧美 | 老司机精品视频网站| 国产色视频一区| 欧美中文字幕在线| 久久久亚洲一区| 亚洲国产欧美日韩另类综合| 欧美电影在线| aa国产精品| 久久成人久久爱| 极品av少妇一区二区| 麻豆久久精品| 99精品国产99久久久久久福利| 亚洲综合视频在线| 国产一区成人| 欧美不卡福利| 一区二区高清在线| 久久久午夜精品| 亚洲人久久久| 国产精品嫩草影院一区二区| 欧美亚洲一级| 91久久国产自产拍夜夜嗨| 亚洲性夜色噜噜噜7777| 国产一区二区丝袜高跟鞋图片| 久久久久久久久蜜桃| 亚洲精品美女久久7777777| 亚洲免费小视频| 激情小说亚洲一区| 欧美精品v日韩精品v国产精品 | 国产一区二区日韩精品欧美精品| 久久久久国产精品午夜一区| 亚洲国产一区二区三区青草影视| 亚洲欧美影音先锋| 亚洲高清成人| 国产精品地址| 蜜臀a∨国产成人精品| 一区二区三区你懂的| 蜜臀91精品一区二区三区| 宅男精品视频| 亚洲福利视频一区二区| 国产精品久久一卡二卡| 另类人畜视频在线| 亚洲综合不卡| 亚洲人成人77777线观看| 久久久久久香蕉网| 亚洲欧美中文另类| 亚洲人成在线观看一区二区| 国产综合视频在线观看| 欧美日韩在线综合| 欧美成人精品1314www| 香蕉久久精品日日躁夜夜躁| 亚洲精品视频在线看| 免费成人高清在线视频| 欧美亚洲在线| 亚洲一区二区三区免费视频| 亚洲精品午夜| 亚洲第一在线视频| 国产日韩欧美在线一区| 欧美亚州在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲免费激情| 亚洲国产日韩欧美在线99| 久久亚洲综合色| 久久精品五月| 久久国产精品久久久久久电车| 亚洲在线国产日韩欧美| 日韩一级免费观看| 日韩视频免费观看高清完整版| 在线色欧美三级视频| 韩国三级电影一区二区| 国产日韩欧美日韩大片| 国产精品揄拍500视频| 欧美性大战久久久久| 欧美视频一区二区三区| 欧美日韩一区三区| 欧美日韩一区成人| 欧美日韩国产首页| 欧美日韩高清在线| 欧美三级资源在线| 欧美精品一区二区在线播放| 欧美激情精品久久久久久蜜臀| 美女亚洲精品| 欧美经典一区二区| 欧美日韩播放| 欧美午夜久久久| 国产精品久久久久久久久久直播| 欧美日韩在线一二三| 国产精品久久福利| 国产精品久久婷婷六月丁香| 国产毛片精品国产一区二区三区| 国产模特精品视频久久久久| 狠狠干综合网| 亚洲国产一区二区三区高清| 99re热精品| 亚洲一区在线播放| 久久aⅴ国产紧身牛仔裤| 久久久国产精彩视频美女艺术照福利| 久久久人成影片一区二区三区| 麻豆精品国产91久久久久久| 亚洲国产中文字幕在线观看| 亚洲免费观看高清完整版在线观看熊| 99成人在线| 欧美制服第一页| 美女久久一区| 欧美三级韩国三级日本三斤| 国产视频亚洲| 最近看过的日韩成人| 亚洲欧美成人一区二区在线电影 | 欧美一进一出视频| 美女精品一区| 国产精品福利影院| 一区在线免费观看| 亚洲色图制服丝袜| 久久九九热免费视频| 亚洲国产91| 亚洲欧美日韩国产成人| 蜜桃av一区| 国产精品爽爽ⅴa在线观看| 一区二区三区在线观看国产| 一区二区三区日韩精品视频| 久久精品亚洲国产奇米99| 亚洲国产欧美在线人成| 西西人体一区二区| 欧美福利小视频| 国产中文一区二区三区| 99热精品在线观看| 久久视频在线免费观看| 亚洲天堂视频在线观看| 欧美超级免费视 在线| 国产精品综合视频| 一本色道**综合亚洲精品蜜桃冫 | 久久久国产成人精品| 欧美日本高清视频| 黄色成人片子| 午夜免费日韩视频| 亚洲欧洲在线看| 久久精品视频在线免费观看| 国产精品久久久久久户外露出| 亚洲第一主播视频| 久久国产免费| 亚洲性图久久| 欧美日韩和欧美的一区二区| 亚洲国产精品久久久久秋霞不卡 | 亚洲第一精品夜夜躁人人爽 | 国产精品一区久久久久| 99伊人成综合| 亚洲电影免费在线观看| 久久激情视频久久| 国产精品日韩一区| 亚洲在线观看| 9人人澡人人爽人人精品| 欧美不卡在线视频| 亚洲第一天堂无码专区| 久久久亚洲国产美女国产盗摄| 亚洲在线日韩| 国产精品一区二区女厕厕| 一区二区三区四区五区精品| 91久久精品日日躁夜夜躁欧美| 久久综合中文| 亚洲国产视频一区二区| 久久综合给合| 久久在线视频在线| 136国产福利精品导航网址| 美女亚洲精品| 裸体丰满少妇做受久久99精品| 亚洲大胆美女视频| 欧美成人高清| 欧美激情综合色| 一区二区三区**美女毛片| 9i看片成人免费高清| 欧美性理论片在线观看片免费| 亚洲在线免费| 亚洲欧美日韩国产成人精品影院|