套接字选项—修改套接字缓冲区大小
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?
//////////////////////////////////////////////////////////////////////////
// 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
有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。
[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
相关文章推荐
- 套接字选项—修改套接字缓冲区大小
- 套接字选项—修改套接字缓冲区大小
- Python网络编程——修改套接字发送和接收的缓冲区大小
- 修改Linux内核的printk缓冲区(log缓冲区)大小
- 修改Linux内核的printk缓冲区(log缓冲区)大小
- 综合使用套接字选项的例子,如设置套接字选项大小,设置套接字地址重用
- Linux下tcp 和 udp 套接字收发缓冲区的大小决定规则
- 修改shell界面回滚缓冲区大小
- LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则
- arduino 串口 缓冲区 大小 修改
- TabLayout切换选项背景和修改字体大小
- LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .
- Linux下tcp 和 udp 套接字收发缓冲区的大小决定规则
- linux设置套接字缓冲区的大小
- linux设置套接字缓冲区的大小
- linux设置套接字缓冲区的大小
- Linux下tcp 和 udp 套接字收发缓冲区的大小决定规则
- arduino修改串口缓冲区大小的三种办法
- Linux下tcp 和 udp 套接字收发缓冲区的大小决定规则
- linux设置套接字缓冲区的大小