2 回答

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

TA貢獻1794條經驗 獲得超7個贊
不需要賦值...recvfrom()應該是UDP通訊的接收函數,一般是socket綁定一個端口,然后就會接收該端口的數據,recvfrom()函數執行的時候,那個from參數輸出的是對方的地址。是一個輸出參數,不是輸入的。
添加回答
舉報