user959883
user959883

Reputation:

Type 'System.Net.Sockets.Socket' cannot be serialized

Type 'System.Net.Sockets.Socket' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.

I am making a service in WCF which opens connection and send message to server but above error is given when i run the service . I do not know how to mark it with data contract attribute or how to solve the problem.

public class Service1 : IService1
{


    public void Connect(String a , String b)
    {

        int hit = Convert.ToInt32(a);

        int delay = Convert.ToInt32(b);
        delay = delay * 1000; 

 // I have eliminated the log making part       string LogPath = "C:\\VoltTestApp\\Logs\\";


        for (int i = 1; i <= hit; i++)
        {

            try
            {
                TcpClient tcpClient = new TcpClient("10.111.13.72", 80);
                Console.WriteLine("Initialized Socket  .............\n");
                Socket socket = tcpClient.Client;
                string str = "ID_T$";

                try
                { // sends the text with timeout 10s
                    Console.WriteLine("Going To Send Request  .............\n");
                    Send(socket, Encoding.UTF8.GetBytes(str.Trim()), 0, str.Length, 10000);
               }


                socket.Close();
                tcpClient.Close();
                Console.WriteLine("Socket Closed  .............\n");
            }

            Thread.Sleep(delay);
        }

    }



    public  void Send(Socket socket, byte[] buffer, int offset, int size, int timeout)
    {
        try
        {
            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);
        }

    }

Upvotes: 0

Views: 1668

Answers (3)

J. Steen
J. Steen

Reputation: 15578

In this instance, it's probably because you have a public method on your service which takes a Socket as a parameter. This is, quite naturally, not able to be serialized properly when attempting service discovery.

If Send is only used internally, set it as private.

Upvotes: 1

Toby Couchman
Toby Couchman

Reputation: 522

You can't sensibly maintain a tcp connection between calls to your wcf service. In your situation I'd remove the Connect method from the service contract, change it to private in your Service1 class, remove the socket parameter from your send method (in both IService1 and its implementation in the Service1 class) and call your connect method from your send method (so that it connects and disconnects for every send)

Upvotes: 1

ForbesLindesay
ForbesLindesay

Reputation: 10702

The error message is misleading, the solution is not to add a DataContractAttribute to System.Net.Sockets.Socket. The problem is that you can't send a socket over the network. More specifically you can't serialize it, and to send it you must be able to serialize it.

You'll need to find a solution that doesn't involve sending a socket over a network (or saving it to disk/a database).

Upvotes: 0

Related Questions