Socket.Send method
Send method sends data from your buffer to a connected Socket. When you callthe Send method it returns number of bytes which were ?sent“. But it doesn'tmean that the bytes were already received by the other side, it only means thatthe data were stored in a socket buffer and the socket will be trying to sendthem. If the socket buffer is full a WouldBlock error occurs.You should wait for a while a try to send the dataagain.
Following method sends size bytes stored in the buffer from theoffset position. If the operation lasts more than timeoutmilliseconds it throws an exception.
[C#]
public static void Send(Socket socket, byte[] buffer, int offset, int size, int timeout){ int startTickCount = Environment.TickCount; int sent = 0; // how many bytes is already sent do { if (Environment.TickCount > startTickCount + timeout) throw new Exception("Timeout."); try { sent += socket.Send(buffer, offset + sent, size - sent, SocketFlags.None); } catch (SocketException ex) { if (ex.SocketErrorCode == SocketError.WouldBlock || ex.SocketErrorCode == SocketError.IOPending || ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { // socket buffer is probably full, wait and try again Thread.Sleep(30); } else throw ex; // any serious error occurr } } while (sent < size);}
To call the Send method use following code snippet (supposethe static Send method is defined in MyClass class). TCP/IP socket can beobtained using TcpClient class. Use TcpClient.Client property to get the underlying Socket (thisproperty is public since .NET Framework2.0).
[C#]
Socket socket = tcpClient.Client;string str = "Hello world!";try{ // sends the text with timeout 10s MyClass.Send(socket, Encoding.UTF8.GetBytes(str), 0, str.Length, 10000);}catch (Exception ex) { /* ... */ }Socket.Receive method
Receive method receives data from a bound Socket to your buffer. The methodreturns number of received bytes. If the socket buffer is empty aWouldBlock error occurs. You should try to receive thedatalater.
Following method tries to receive size bytes into the buffer tothe offset position. If the operation lasts more than timeoutmilliseconds it throws an exception.
[C#]
public static void Receive(Socket socket, byte[] buffer, int offset, int size, int timeout){ int startTickCount = Environment.TickCount; int received = 0; // how many bytes is already received do { if (Environment.TickCount > startTickCount + timeout) throw new Exception("Timeout."); try { received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None); } catch (SocketException ex) { if (ex.SocketErrorCode == SocketError.WouldBlock || ex.SocketErrorCode == SocketError.IOPending || ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { // socket buffer is probably empty, wait and try again Thread.Sleep(30); } else throw ex; // any serious error occurr } } while (received < size);}
Call the Receive method using code such this:
[C#]
Socket socket = tcpClient.Client;byte[] buffer = new byte[12]; // length of the text "Hello world!"try{ // receive data with timeout 10s MyClass.Receive(socket, buffer, 0, buffer.Length, 10000); string str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);}catch (Exception ex) { /* ... */ }
![Socket Send and Receive [C#] c socket receive](http://img.413yy.cn/images/31101031/31102854t010ef6bb644e8ea635.jpg)
See also
[C#] Download Files from Web– how todownload files from url to localdisk
[C#] Check Local IP Address– check whether anIP islocal
Socket– MSDN– provides many methods for networkcommunications
Socket.Send– MSDN– sends data to a socket
Socket.Receive– MSDN– receives data fromasocket
SocketError– MSDN– enumeration with error codes forthe Socket (WouldBlock)
TcpClient– MSDN– provides client connectionsforTCP
TcpClient.Client– MSDN– gets theunderlyingSocket
By Jan Slama, 2007