2 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
recvfrom函數(shù)用于從(已連接)套接口上接收數(shù)據(jù),并捕獲數(shù)據(jù)發(fā)送源的地址。
本函數(shù)用于從(已連接)套接口上接收數(shù)據(jù),并捕獲數(shù)據(jù)發(fā)送源的地址。
對(duì)于SOCK_STREAM類型的套接口,最多可接收緩沖區(qū)大小個(gè)數(shù)據(jù)。如果套接口被設(shè)置為線內(nèi)接收帶外數(shù)據(jù)(選項(xiàng)為SO_OOBINLINE),且有帶外數(shù)據(jù)未讀入,則返回帶外數(shù)據(jù)。應(yīng)用程序可通過(guò)調(diào)用ioctlsocket()的SOCATMARK命令來(lái)確定是否有帶外數(shù)據(jù)待讀入。對(duì)于SOCK_STREAM類型套接口,忽略from和fromlen參數(shù)。
對(duì)于數(shù)據(jù)報(bào)類套接口,隊(duì)列中第一個(gè)數(shù)據(jù)報(bào)中的數(shù)據(jù)被解包,但最多不超過(guò)緩沖區(qū)的大小。如果數(shù)據(jù)報(bào)大于緩沖區(qū),那么緩沖區(qū)中只有數(shù)據(jù)報(bào)的前面部分,其他的數(shù)據(jù)都丟失了,并且recvfrom()函數(shù)返回WSAEMSGSIZE錯(cuò)誤。
若from非零,且套接口為SOCK_DGRAM類型,則發(fā)送數(shù)據(jù)源的地址被復(fù)制到相應(yīng)的sockaddr結(jié)構(gòu)中。fromlen所指向的值初始化時(shí)為這個(gè)結(jié)構(gòu)的大小,當(dāng)調(diào)用返回時(shí)按實(shí)際地址所占的空間進(jìn)行修改。
如果沒(méi)有數(shù)據(jù)待讀,那么除非是非阻塞模式,不然的話套接口將一直等待數(shù)據(jù)的到來(lái),此時(shí)將返回SOCKET_ERROR錯(cuò)誤,錯(cuò)誤代碼是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以獲知何時(shí)數(shù)據(jù)到達(dá)。
如果套接口為SOCK_STREAM類型,并且遠(yuǎn)端“優(yōu)雅”地中止了連接,那么recvfrom()一個(gè)數(shù)據(jù)也不讀取,立即返回。如果立即被強(qiáng)制中止,那么recv()將以WSAECONNRESET錯(cuò)誤失敗返回。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
不需要賦值...recvfrom()應(yīng)該是UDP通訊的接收函數(shù),一般是socket綁定一個(gè)端口,然后就會(huì)接收該端口的數(shù)據(jù),recvfrom()函數(shù)執(zhí)行的時(shí)候,那個(gè)from參數(shù)輸出的是對(duì)方的地址。是一個(gè)輸出參數(shù),不是輸入的。
添加回答
舉報(bào)