Socket同步和异步的区别

fangshaoshen 2011-04-14 11:44:33
这两天一直在了解Socket。 同步 和异步 的 Socket 都知道怎么用了。 可是我感觉它们达到的效果都是一样的。

谁能说说 同步Socket和 异步Socket 的区别呢?
...全文
255 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiuzhengxiang 2011-04-14
  • 打赏
  • 举报
回复
这个很简单哦,例如拿send发送数据包来说,当你有N个数据包要发送,同步的话你得发送完了一个包等到发送完了才能发送第二个,一直这样按顺序发,必须上一个发完了才能发送下一个;而异步呢,却不然,它可以不管上个包是否发送完了,它就可以发送下一个,不必花时间去等待,它不用管你发没发完就可以直接发下一个。
lizhibin11 2011-04-14
  • 打赏
  • 举报
回复
说来话长,看看下面这篇文章,你可以了解windows socket编程的演变史。
http://blog.csdn.net/normalnotebook/archive/2006/07/30/999840.aspx
lizhibin11 2011-04-14
  • 打赏
  • 举报
回复
要看C# socket编程如何调用完成端口的,贴一个socket类源代码beginreceive接收部分,和链接中调用的api完全一样,但那个链接的文章的好处就是,用文字说明了完成端口的道理。

public bool ReceiveAsync(SocketAsyncEventArgs e)
{
bool flag;
int num;
SocketError error;
if (s_LoggingEnabled)
{
Logging.Enter(Logging.Sockets, this, "ReceiveAsync", "");
}
if (this.CleanedUp)
{
throw new ObjectDisposedException(base.GetType().FullName);
}
e.StartOperationCommon(this);
e.StartOperationReceive();
this.BindToCompletionPort();
SocketFlags socketFlags = e.m_SocketFlags;
try
{
if (e.m_Buffer != null)
{
error = UnsafeNclNativeMethods.OSSOCK.WSARecv(this.m_Handle, ref e.m_WSABuffer, 1, out num, ref socketFlags, e.m_PtrNativeOverlapped, IntPtr.Zero);
}
else
{
error = UnsafeNclNativeMethods.OSSOCK.WSARecv(this.m_Handle, e.m_WSABufferArray, e.m_WSABufferArray.Length, out num, ref socketFlags, e.m_PtrNativeOverlapped, IntPtr.Zero);
}
}
catch (Exception exception)
{
e.Complete();
throw exception;
}
if (error != SocketError.Success)
{
error = (SocketError) Marshal.GetLastWin32Error();
}
if ((error != SocketError.Success) && (error != SocketError.IOPending))
{
e.FinishOperationSyncFailure(error, num, socketFlags);
flag = false;
}
else
{
flag = true;
}
if (s_LoggingEnabled)
{
Logging.Exit(Logging.Sockets, this, "ReceiveAsync", flag);
}
return flag;
}
private unsafe void CompletionPortCallback(uint errorCode, uint numBytes, NativeOverlapped* nativeOverlapped)
{
SocketFlags none = SocketFlags.None;
SocketError socketError = (SocketError) errorCode;
switch (socketError)
{
case SocketError.Success:
this.FinishOperationSuccess(socketError, (int) numBytes, none);
return;

case SocketError.OperationAborted:
break;

default:
if (this.m_CurrentSocket.CleanedUp)
{
socketError = SocketError.OperationAborted;
}
else
{
try
{
UnsafeNclNativeMethods.OSSOCK.WSAGetOverlappedResult(this.m_CurrentSocket.SafeHandle, (IntPtr) nativeOverlapped, out numBytes, false, out none);
socketError = (SocketError) Marshal.GetLastWin32Error();
}
catch
{
socketError = SocketError.OperationAborted;
}
}
break;
}
this.FinishOperationAsyncFailure(socketError, (int) numBytes, none);
}
fangshaoshen 2011-04-14
  • 打赏
  • 举报
回复
还有人能说说自己的看法吗
fangshaoshen 2011-04-14
  • 打赏
  • 举报
回复
2楼的连接是VC的 。
感谢三楼的回答。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧