当前位置:编程学习 > C#/ASP.NET >>

C# Socket发送不出去怎么办?

我写了一个异步发送的试验程序,对于局域网没有问题,可是外地上线的朋友却只收到一次数据,然而我这里发送了十次数据,最后我的程序停在那里不发了,请各位高手帮帮忙
我的程序是这样的

...
textBox1.AppendText("开始向客户端发送数据...");
client.BeginSend(buf, 0, bytesCount, SocketFlags.None, this.callbackOnServer1Send, client);
...

private void callbackOnServer1Send(IAsyncResult asResult)
{
    int bytesCount = this.Server1.EndSend(asResult);
    textBox1.AppendText("发送成功"+Environment.NewLine);
}

结果在textBox1里显示
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...

而客户端只收到一次数据,不知道怎么办了。 --------------------编程问答-------------------- 结束挂起的异步发送。

[C#]
public int EndSend(
   IAsyncResult asyncResult
);

参数
asyncResult 
IAsyncResult,它存储此异步操作的状态信息。 
返回值
如果成功,则将返回向 Socket 发送的字节数;否则会返回无效 Socket 错误。

你应该看看返回的是不是发送成功? --------------------编程问答-------------------- 你这样写当然只发一次了
异步不是很好控制  
我建议用同步发 异步收 --------------------编程问答-------------------- 用什么连的?在网络不是很好的情况下(尤其是异地发送),使用tcp连比udp好。 --------------------编程问答-------------------- 我用的就是tcp
我已经发送了9次啊,而且在局域网内没有任何问题。我在本市网吧也试过了没有问题,只是外地的朋友通讯不上,不知道为什么了。 --------------------编程问答-------------------- 我也用同步发试过,结果是一样的,真搞不清楚,头都大了 --------------------编程问答-------------------- 在callbackOnServer1Send()的方法中用一下委托和ui传消息
private delegate void SetValue(string con);
private void callbackOnServer1Send(IAsyncResult asResult)
{
    int bytesCount = this.Server1.EndSend(asResult);
    if(textBox.InvokeRequired)
    {
    textBox1.AppendText("发送成功"+Environment.NewLine);

} --------------------编程问答-------------------- [over write]
在callbackOnServer1Send()的方法中用一下委托和ui传消息

private delegate void SetValue();
private void callbackOnServer1Send(IAsyncResult asResult)
{
    int bytesCount = this.Server1.EndSend(asResult);
    if(textBox.InvokeRequired)
    {
      this.Invoke(new SetValue(SetValueToText),null);
    }
}
priavte void SetValueToText()
{
    textBox1.AppendText("发送成功"+Environment.NewLine);
} --------------------编程问答-------------------- 用了委托结果还是一样,晕死了 --------------------编程问答-------------------- 谢谢各位了,问题基本解决了
把做法写出来,大家帮我看看还有没有更好的方法
private byte[] buf[] = new byte[1024];
...
...
...
this.ClientCon.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, this.buf.Length);
只加了这一句,把Socket发送缓冲区的大小和我使用的缓冲区的大小设的一样就好了
主要原因是对方网络不好,造成我这里发送超时 --------------------编程问答-------------------- this.ClientCon.SetSocketOption(SocketOptionLevel.Socket,   SocketOptionName.SendBuffer,   this.buf.Length); 
是放在哪个位置 --------------------编程问答-------------------- 我碰到的也是这个问题,客户端发送给服务器转发的程序,发送一会,服务器就收不到了,但调试发现确实还在发送,而且socket的TCP也没有断!用你的方法试试 --------------------编程问答-------------------- 因为我每次发送的数据的大小不一样,所以我是在发送之前设置一下
 private void videoBufferSend(Socket handler, byte[] byteData)
        {
            try
            {
                
                handler.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, byteData.Length); 
                // Begin sending the data to the remote device.
                handler.BeginSend(byteData, 0, byteData.Length, 0,
                    new AsyncCallback(videoBufferSendCallback), handler);
            }
            catch (Exception e)
            {
                MessagerichTextBox.Invoke(MessageTextBoxdel,e.ToString());
            }
        } --------------------编程问答-------------------- 我在想,楼主是不是碰到了NAT问题
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,