1. 设置接收缓冲区的
int RevBuf=20;
setsockopt( sNew,SOL_SOCKET,SO_RCVBUF, (char *)&RevBuf,sizeof(RevBuf));
2. 发送缓冲区的
SO_SNDBUF
3. 设置超时的
int timeout = 1000;
bread = setsockopt(SockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout, sizeof(timeout));
4. 设置地址重用的
int nActivate = 1;
//允许地址重用
if (setsockopt(hSocket, SOL_SOCKET, SO_REUSEADDR, (const char *) &nActivate,sizeof(nActivate)) == SOCKET_ERROR ) {}
5. 连接服务器
SOCKET sock=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(nPort);
sin.sin_addr.s_addr = inet_addr("192.168.100.159");
if(connect(sock,(sockaddr *)&sin,sizeof(sin)) == SOCKET_ERROR)
return ;
6. 建立侦听sock
int MakeStreamSocket()
{
int iErrorCode;
sockaddr_in skAddr;
CString strPort;
CConfigFile::ReadTcpCfg(strPort );
skAddr.sin_addr.s_addr = htonl(INADDR_ANY);
skAddr.sin_port = htons( atoi( strPort ) );
skAddr.sin_family = AF_INET;
SOCKET sk = socket(AF_INET,SOCK_STREAM,0);
if ( sk == INVALID_SOCKET )
{
return INVALID_SOCKET;
}
unsigned long uArg;
uArg = 0;
ioctlsocket( sk,FIONBIO,(unsigned long *)&uArg );
iErrorCode = bind( sk,(sockaddr *)&skAddr,sizeof(sockaddr) );
if ( iErrorCode == SOCKET_ERROR )
{
return INVALID_SOCKET;
}
int nActivate = 2048;
setsockopt( sk,SOL_SOCKET,SO_RCVBUF,(const char *) &nActivate,sizeof(nActivate) );
if ( listen( sk,100 ) != 0 )
{
return INVALID_SOCKET;
}
return sk;
}
7. accept中获取ip
SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen );
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
(2)
CAsyncSocket ConnectedSoc
MySocket.Accept(ConnectedSoc);
CString rPeerAddress;
UINT rPeerPort;
ConnectedSoc.GetPeerName(rPeerAddress, rPeerPort );