setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&rcvbuf,sizeof(int));
示例:
#ifndef _MY_SOCKET_#define _MY_SOCKET_#ifdef WIN32#include <Windows.h>#include <WinSock.h>#else#include <sys/socket.h>#include <sys/types.h>#endifclass Socket{public: enum EMode{BLOCKING,NOBLOCKING};public: Socket(); ~Socket(); int Connect(char *destaddr,unsigned short port); int Bind(char *paddr,int port); int Listen(); int Accept(); void Ioctlsocket(EMode mode); void SetBufferSize(); int RecvData(char *recvbuf,int len); int SendData(char *sendbuf,int len);private: int s;//监听socket int socks;//建联socket};#endif#include "Socket.h"Socket::Socket(){#ifdef WIN32 /* 加载socket dll 库,第一个调用的函数 WSAStartup(Word wVersionRequired,LPWSADATA lpWSAData); wVersionRequired:动态库版本,MAKEWORD(X,Y)指定参数; lpWSAData:动态库相关信息*/ LPWSADATA lpWSAData={0}; int iRet=WSAStartup(MAKEWORD(2,2),&lpWSAData); if(iRet!=0){ WSACleanup(); } #else #endif s=socket(AF_INET,NULL,SOCK_STREAM); }Socket::~Socket(){ closesocket(s);}int Socket::Bind(char* paddr,int port){ sockaddr_in severaddr; severaddr.sin_addr.s_addr=inet_addr(paddr); severaddr.sin_family=AF_INET; severaddr.sin_port=htons(port); return bind(s,(sockaddr*)&severaddr,sizeof(severaddr));}int Socket::Connect(char *destaddr,unsigned short port){ sockaddr_in server; server.sin_addr.s_addr=inet_addr(destaddr); server.sin_family=AF_INET; server.sin_port=htons(port); return connect(s,(sockaddr*)&server,sizeof(server));}int Socket::Listen(){ listen(s,4);}int Socket::Accept(){ sockaddr_in client; int client_len=sizeof(client); /*client 内容接受后客户填充*/ int socks=accept(s,(sockaddr*)&client,&client_len); if(socks==-1){ return false; } return true;}void Socket::Ioctlsocket(EMode mode){ /*ioctlsocket(s,long cmd,u_long* argp); cmd:输入输出控制命令,FIONBIO,FIONREAD,SIOCATMARK; argp:指向cmd指针; FIONBIO:默认从阻塞模式转非阻塞,或者相反转变,*argp=TRUE(非0),socket变非阻塞,*argp=FALSE(0),socket阻塞; */ if(mode==EMode::NOBLOCKING) { unsigned long ul=1; ioctlsocket(s,FIONBIO,(unsigned long*)&ul); } else{ unsigned long ul=0; ioctlsocket(s,FIONBIO,(unsigned long*)&ul); } }void Socket::SetBufferSize(){ long rcvbuf=1024*10; setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&rcvbuf,sizeof(long));}int Socket::RecvData(char *recvbuf,int len){ return recv(s,recvbuf,len,0);}int Socket::SendData(char *sendbuf,int len){ return send(s,sendbuf,len,0);}
新闻热点
疑难解答