您的位置:首页 > 其它

套接字选项—修改套接字缓冲区大小

2013-03-13 15:59 330 查看
/article/2960387.html

有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。

[cpp]
view plaincopyprint?

int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)

[cpp]
view plaincopyprint?

//////////////////////////////////////////////////////////////////////////

// SocketOptionSrv.cpp
// 套接字选项 —— 设置缓冲大小(扩大10倍)

#include <iostream.h>

#include <winsock2.H>

#define BUF_SIZE    64
#pragma comment(lib,"ws2_32.lib")

int main(int argc,char* argv[])
{
WSADATA         wsd;
SOCKET          s;
SOCKADDR_IN     servAddr;
char            bufRecv[BUF_SIZE];
char            bufSend[BUF_SIZE];

// 初始化套接字
if(WSAStartup(MAKEWORD(2,2),&wsd))
{
cout<<"WSAStartup failed !/n"<<endl;
return 1;
}
// 连理套接字
s = socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET == s)
{
cout<<"socket failed !/n"<<endl;
WSACleanup();
return 1;
}

int nErrorCode;
int nBufLen;
int nOptLen = sizeof(nBufLen);

// 获取当前套接字s的接受数据缓冲区大小
nErrorCode = getsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&nBufLen,&nOptLen);
if(SOCKET_ERROR == nErrorCode)
{
cout<<"getsockopt failed !/n"<<endl;
WSACleanup();
return 1;
}

// 设置当前套接字s的接受数据缓冲区为原来的10倍

nBufLen *= 10;
nErrorCode = setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&nBufLen,nOptLen);
if(SOCKET_ERROR == nErrorCode)
{
cout<<"setsockopt failed !/n"<<endl;
WSACleanup();
return 1;
}

// 检查套接字s的接受缓冲区是否设置成功

int uiNewRcvBuf;
getsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&uiNewRcvBuf,&nOptLen);
if(SOCKET_ERROR == nErrorCode || uiNewRcvBuf != nBufLen)
{
cout<<"The buf isn't same from Recv."<<endl;
WSACleanup();
return 1;
}

// 设置服务器现象
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(5000);
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

// 绑定套接字
if(bind(s,(SOCKADDR *)&servAddr,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout<<"bind failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}

SOCKADDR_IN clientAddr;
int         nClientLen;

// 缓冲区待发送的数据
ZeroMemory(bufRecv,BUF_SIZE);
ZeroMemory(bufSend,BUF_SIZE);
strcpy(bufSend,"Hello World !");
nClientLen = sizeof(clientAddr);
while(1)
{
// 从客户端接受数据
if(recvfrom(s,bufRecv,BUF_SIZE,0,(SOCKADDR *)&clientAddr,&nClientLen) == SOCKET_ERROR)
{
cout<<"recv failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}
cout<<"Recv From Client:"<<bufRecv<<endl;

// 向服务器发送数据
if(sendto(s,bufSend,BUF_SIZE,0,(SOCKADDR *)&clientAddr,nClientLen) == SOCKET_ERROR)
{
cout<<"send to Client failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}
}

// 关闭套接字,释放资源
closesocket(s);
WSACleanup();
return 0;
}

//////////////////////////////////////////////////////////////////////////
// SocketOptionSrv.cpp
// 套接字选项 —— 设置缓冲大小(扩大10倍)

#include <iostream.h>
#include <winsock2.H>

#define BUF_SIZE	64
#pragma comment(lib,"ws2_32.lib")

int main(int argc,char* argv[])
{
WSADATA			wsd;
SOCKET			s;
SOCKADDR_IN		servAddr;
char			bufRecv[BUF_SIZE];
char			bufSend[BUF_SIZE];

// 初始化套接字
if(WSAStartup(MAKEWORD(2,2),&wsd))
{
cout<<"WSAStartup failed !/n"<<endl;
return 1;
}
// 连理套接字
s = socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET == s)
{
cout<<"socket failed !/n"<<endl;
WSACleanup();
return 1;
}

int nErrorCode;
int nBufLen;
int nOptLen = sizeof(nBufLen);

// 获取当前套接字s的接受数据缓冲区大小
nErrorCode = getsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&nBufLen,&nOptLen);
if(SOCKET_ERROR == nErrorCode)
{
cout<<"getsockopt failed !/n"<<endl;
WSACleanup();
return 1;
}

// 设置当前套接字s的接受数据缓冲区为原来的10倍
nBufLen *= 10;
nErrorCode = setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&nBufLen,nOptLen);
if(SOCKET_ERROR == nErrorCode)
{
cout<<"setsockopt failed !/n"<<endl;
WSACleanup();
return 1;
}

// 检查套接字s的接受缓冲区是否设置成功
int uiNewRcvBuf;
getsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&uiNewRcvBuf,&nOptLen);
if(SOCKET_ERROR == nErrorCode || uiNewRcvBuf != nBufLen)
{
cout<<"The buf isn't same from Recv."<<endl;
WSACleanup();
return 1;
}

// 设置服务器现象
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(5000);
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

// 绑定套接字
if(bind(s,(SOCKADDR *)&servAddr,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout<<"bind failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}

SOCKADDR_IN	clientAddr;
int			nClientLen;

// 缓冲区待发送的数据
ZeroMemory(bufRecv,BUF_SIZE);
ZeroMemory(bufSend,BUF_SIZE);
strcpy(bufSend,"Hello World !");
nClientLen = sizeof(clientAddr);
while(1)
{
// 从客户端接受数据
if(recvfrom(s,bufRecv,BUF_SIZE,0,(SOCKADDR *)&clientAddr,&nClientLen) == SOCKET_ERROR)
{
cout<<"recv failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}
cout<<"Recv From Client:"<<bufRecv<<endl;

// 向服务器发送数据
if(sendto(s,bufSend,BUF_SIZE,0,(SOCKADDR *)&clientAddr,nClientLen) == SOCKET_ERROR)
{
cout<<"send to Client failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}
}

// 关闭套接字,释放资源
closesocket(s);
WSACleanup();
return 0;
}


[cpp]
view plaincopyprint?

//////////////////////////////////////////////////////////////////////////

// SocketOptionClient.cpp
// 套接字选项 —— 设置缓冲大小(扩大10倍)

#include <iostream.h>

#include <winsock2.H>

#define BUF_SIZE 64
#pragma comment(lib,"ws2_32.lib")

int main(int argc,char* argv[])
{
WSADATA wsd;
SOCKET s;
SOCKADDR_IN servAddr;
char bufRecv[BUF_SIZE];
char bufSend[BUF_SIZE];

// 初始化套接字
if(WSAStartup(MAKEWORD(2,2),&wsd))
{
cout<<"WSAStartup failed !/n"<<endl;
return 1;
}

// 建立套接字
s = socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET == s)
{
cout<<"socket failed !/n"<<endl;
WSACleanup();
return 1;
}

// 缓冲区待发送的数据
ZeroMemory(bufSend,BUF_SIZE);
ZeroMemory(bufRecv,BUF_SIZE);
strcpy(bufSend,"Hello World !");

// 设置服务器选项
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr("192.168.1.254");
servAddr.sin_port = htons(5000);

int nServerlen = sizeof(servAddr);
while(1)
{
// 向服务器发送数据
if(sendto(s,bufSend,BUF_SIZE,0,(SOCKADDR *)&servAddr,nServerlen) == SOCKET_ERROR)
{
cout<<"sendto failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}
// 从服务器接受数据
if(recvfrom(s,bufRecv,BUF_SIZE,0,(SOCKADDR *)&servAddr,&nServerlen) == SOCKET_ERROR)
{
cout<<"recv failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}
cout<<"Recv From Server:"<<bufRecv<<endl;
}

// 关闭套接字,释放资源
closesocket(s);
WSACleanup();
return 0;
}

//////////////////////////////////////////////////////////////////////////
// SocketOptionClient.cpp
// 套接字选项 —— 设置缓冲大小(扩大10倍)

#include <iostream.h>
#include <winsock2.H>

#define BUF_SIZE 64
#pragma comment(lib,"ws2_32.lib")

int main(int argc,char* argv[])
{
WSADATA wsd;
SOCKET s;
SOCKADDR_IN servAddr;
char bufRecv[BUF_SIZE];
char bufSend[BUF_SIZE];

// 初始化套接字
if(WSAStartup(MAKEWORD(2,2),&wsd))
{
cout<<"WSAStartup failed !/n"<<endl;
return 1;
}

// 建立套接字
s = socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET == s)
{
cout<<"socket failed !/n"<<endl;
WSACleanup();
return 1;
}

// 缓冲区待发送的数据
ZeroMemory(bufSend,BUF_SIZE);
ZeroMemory(bufRecv,BUF_SIZE);
strcpy(bufSend,"Hello World !");

// 设置服务器选项
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr("192.168.1.254");
servAddr.sin_port = htons(5000);

int nServerlen = sizeof(servAddr);
while(1)
{
// 向服务器发送数据
if(sendto(s,bufSend,BUF_SIZE,0,(SOCKADDR *)&servAddr,nServerlen) == SOCKET_ERROR)
{
cout<<"sendto failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}
// 从服务器接受数据
if(recvfrom(s,bufRecv,BUF_SIZE,0,(SOCKADDR *)&servAddr,&nServerlen) == SOCKET_ERROR)
{
cout<<"recv failed:"<<WSAGetLastError()<<endl;
closesocket(s);
WSACleanup();
return 1;
}
cout<<"Recv From Server:"<<bufRecv<<endl;
}

// 关闭套接字,释放资源
closesocket(s);
WSACleanup();
return 0;
}

程序运行效果:



源码下载地址:

http://download.csdn.net/source/1676947
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: