linux和windows下用setsockopt設定so_sndtimeo,so_rcvtimeo的引數的一點區別
udp的socket在某些情況:如對方關閉時,本地可能sendto不出去資料,然後recvfrom就會被阻塞,這時就需要設定 這兩個引數的值提高程式質量。
linux:
struct timeval timeout=;//3s
int ret=setsockopt(sock_fd,sol_socket,so_sndtimeo,(const char*)&timeout,sizeof(timeout));
int ret=setsockopt(sock_fd,sol_socket,so_rcvtimeo,(const char*)&timeout,sizeof(timeout));
如果ret==0 則為成功,-1為失敗,這時可以檢視errno來判斷失敗原因
int recvd=recv(sock_fd,buf,1024,0);
if(recvd==-1&&errno==eagain)
windows:
int timeout = 3000; //3s
int ret=setsockopt(sock_fd,sol_socket,so_sndtimeo,&timeout,sizeof(timeout));
int ret=setsockopt(sock_fd,sol_socket,so_rcvtimeo,&timeout,sizeof(timeout));
而solaris,則不支援。
SOCKET之Send和Recv理解
int send socket s,const char buf,int len,int flags 引數描述 同步 socket 的send函式的執行流程如下 如果len大於傳送緩衝區剩餘空間大小 不足放入剩餘傳送緩衝區 send就一直 等待協議把s傳送緩衝區中的資料傳送完 如果len小於傳送緩衝...
socket中send函式和recv函式的理解
int send socket s,const char buf,int len,int flags 引數描述 同步 socket 的send函式的執行流程如下 如果len大於傳送緩衝區剩餘空間大小 不足放入剩餘傳送緩衝區 send就一直 等待協議把s傳送緩衝區中的資料傳送完 如果len小於傳送緩衝...
socket之send和recv原理剖析
當建立乙個tcp scoket 物件的時候會有乙個傳送緩衝區和接收緩衝區,這個傳送和接受快取區指的就是記憶體中的一片空間 send是不是直接把資料發給伺服器?不是,要想傳送資料必須通過網絡卡傳送資料,應用程式是無法直接通過網絡卡傳送資料的,他需要呼叫作業系統介面,也就是說,應用程式把資料先寫入到快取...