1、前面的明顯不正確,send如果是TCP,(UDP 不應(yīng)該用send),send返回時(shí),消息已經(jīng)發(fā)出了。
創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元永川做網(wǎng)站,已為上家服務(wù),為永川各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
2、你的代碼其實(shí)沒有任何問題,之所以 server 沒有打印,是由于server最后打印時(shí)的代碼是 printf(%s,buff);把它改成 printf(%s\n,buff);即可。
3、發(fā)送前用memset清零數(shù)據(jù),然后給數(shù)據(jù)賦值,發(fā)送。接受前用memset清零內(nèi)存,然后接收數(shù)據(jù)。注意:發(fā)送時(shí)長(zhǎng)度要+1,用來儲(chǔ)存\0。
4、recv和send函數(shù)提供了和read和write差不多的功能。
5、recv和send recv和send函數(shù)提供了和read和write差不多的功能.但是他們提供了第四個(gè)參數(shù)來控制讀寫操作。
6、的區(qū)別是,這個(gè)函數(shù)可以發(fā)送socket控制信息,看API就知道。另外我也沒有看到有write/read函數(shù)。 sendto/recvfrom用于UDP鏈接,send/recv用于TCP鏈接。你列舉的其余函數(shù),我都沒找到。上面的API地址供樓主查詢驗(yàn)證。
多個(gè)客戶端之間進(jìn)行通訊,通過服務(wù)器轉(zhuǎn)發(fā)的形式,現(xiàn)在客戶端1請(qǐng)求向客戶端2發(fā)送消息,先把消息發(fā)送到服務(wù)器,服務(wù)器怎么才能把消息轉(zhuǎn)發(fā)到客戶端2而不是轉(zhuǎn)發(fā)給客戶端3或者他自己。
下面用Socket實(shí)現(xiàn)一個(gè)windows下的c語言socket通信例子,這里我們客戶端傳遞一個(gè)字符串,服務(wù)器端進(jìn)行接收。
客戶端:socket--connect--read/write 服務(wù)器:socket--bind--listen--accept--write/read 若要通訊必須要有服務(wù)器,只有在connect和accept建立好連接之后才能真正的通信。
client除了在send/recv, 還可以在connect前設(shè)置非阻塞模式,這樣在connect時(shí)候可以直接返回。
socket默認(rèn)創(chuàng)建時(shí)設(shè)定為阻塞模式;若要將socket設(shè)定為非阻塞模式,可以在socket創(chuàng)建時(shí)設(shè)定為非阻塞模式,那么函數(shù)recv就是非阻塞的。
方法 用setsockopt設(shè)置阻塞超時(shí)時(shí)間,recvfrom阻塞一段超時(shí)后,退出響應(yīng)其他線程的消息。 方法 主線程直接把recvfrom的socket close掉,recvfrom會(huì)報(bào)錯(cuò)退出。
IP_HDRINCL選項(xiàng)需要administrator權(quán)限,或者修改注冊(cè)表:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\DisableRawSecurity(類型為DWORD),把值修改為 1。
你用輪詢的辦法只會(huì)導(dǎo)致效率比阻塞的還差。。你應(yīng)該用select接口判斷該socket 是否有read事件,有的話才去調(diào)用recv recv的時(shí)候還要判斷是否有would_block錯(cuò)誤,此錯(cuò)誤表明recv還在進(jìn)行中,要等下次recv才能接受完畢。