CAsyncSocket::ReceiveFrom
Bir veri birimi alma ve kaynak adresini saklamak için bu üye işlev çağrısı sockaddr yapısı veya rSocketAddress.
int ReceiveFrom(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0
);
int ReceiveFrom(
void* lpBuf,
int nBufLen,
SOCKADDR* lpSockAddr,
int* lpSockAddrLen,
int nFlags = 0
);
Parametreler
lpBuf
Gelen veriler için arabellek.nBufLen
Uzunluğu, lpBuf bayt.rSocketAddress
Başvuru için bir CString noktalı sayı bir IP adresi alır nesnesi.rSocketPort
Başvuru için bir UINT , bir bağlantı noktası depolar.lpSockAddr
Bir işaretçi bir sockaddr iade sonrasında kaynak adresi tutan yapısı.lpSockAddrLen
Kaynak adresi uzunluğunu gösteren bir işaretçi lpSockAddr bayt.nFlags
Çağrının yapıldığı biçimini belirtir.Bu işlevin semantiği soket seçenekleri tarafından belirlenir ve nFlags parametresi.Bu sonuncusu aşağıdaki değerlerden herhangi birine sahip C++ birleştirilerek oluşturulur OR işleci:msg_peek gelen veri gözatma.Veriler arabelleğe kopyalanır, ancak giriş kuyruğundan kaldırılmaz.
msg_oob bant içi veri işleme.
Dönüş Değeri
Herhangi bir hata oluşursa, ReceiveFrom alınan bayt sayısını döndürür.Bağlantı kapatıldı, 0 döndürür.Aksi halde, değeri socket_error iade edilir ve belirli bir hata kodu çağırarak alınabilir GetLastError.Aşağıdaki hatalar bu üye işlev için geçerlidir:
WSANOTINITIALISED başarılı bir AfxSocketInit Bu API kullanmadan önce gerçekleştirilmelidir.
wsaenetdown Windows Sockets başlatılmasının algılanan ağ alt sistemi başarısız oldu.
wsaefaultlpSockAddrLen bağımsız değişken geçersiz: lpSockAddr arabellek eş adresi alamayacak kadar küçük.
WSAEINPROGRESS engelleyen bir Windows yuva işlemi devam ediyor.
WSAEINVAL yuva ile bağlanmış değil bağlamak.
wsaenotconn Yuva bağlı değil (sock_stream sadece).
wsaenotsock bir soket tanımlayıcısı değil.
WSAEOPNOTSUPP msg_oob belirtildi, ancak yuva türü değil sock_stream.
wsaeshutdown yuva; aşağı Kapat Çağrı yapılamaz ReceiveFrom sonra bir yuvada ShutDown ile çağrılan nHow 0 veya 2'ye ayarlayın.
wsaewouldblock yuva işaretlenmiş olarak yapmayan ve ReceiveFrom işlemi engelleyin.
WSAEMSGSIZE datagram belirtilen arabelleğe sığmayacak kadar büyük ve kesildi.
wsaeconnaborted sanal devrenin zaman aşımı veya diğer hata iptal edildi.
wsaeconnreset sanal devrenin uzak uç tarafından sıfırlandı.
Notlar
Bu işlev (büyük olasılıkla bağlı) bir yuva üzerinde gelen verileri okuyabilir ve verilerin gönderildiği adres yakalamak için kullanılır.
IPv6 adresleri işlemek için kullanmak CAsyncSocket::ReceiveFromEx.
Yuva türü için sock_stream, sağlanan arabellek boyutu en fazla şu anda kullanılabilir ne kadar bilgi iade olarak.Yuva satır içi bant içi veri alımını yapılandırdıysanız (yuva seçeneği SO_OOBINLINE) ve bant içi veri okunmamış, yalnızca-in-bant veri döndürülmesi.Uygulamanın kullanabileceği IOCTLSIOCATMARK seçeneğini ya da OnOutOfBandData daha-bant veri okunacak kalır olup olmadığını belirlemek için.lpSockAddr Ve lpSockAddrLen parametreleri için dikkate sock_stream yuva.
Datagram yuva için sağlanan arabellek boyutu en fazla ilk sıraya alındı datagram gelen veriler ayıklanır.Datagram, sağlanan arabellekten daha büyük ise, iletiyi ilk bölümüyle arabelleğinin Dolum, fazladan veriler kaybolur ve ReceiveFrom değerini döndürür socket_error hata koduyla ayarlamak WSAEMSGSIZE.
lpSockAddr Sıfır olmayan, olduğu ve socket türüdür sock_dgram, karşılık gelen veri gönderdiği yuva ağ adresini kopyalanan sockaddr yapısı.Tarafından için değer ulaşılan lpSockAddrLen Bu yapı boyutu başlatılır ve orada depolanan adres gerçek boyutu belirtmek için return değiştirilebilir.Gelen veri kullanılabiliyorsa, yuva ReceiveFrom çağrısını bekler yuva olmadıkça gelmesi için veri yapmayan.Bu durumda değeri de socket_error belirlemek hata kodu döndürdü wsaewouldblock.OnReceive Geri arama, daha fazla veri geldiğinde belirlemek için kullanılabilir.
Yuva türü ise sock_stream ve uzak tarafı bağlantısını düzgün kapattı bir ReceiveFrom 0 bayt alındı hemen tamamlayacak.
Gereksinimler
Başlık: afxsock.h