c++winsocket(七)
3656 ワード
一つの問題
1つのクライアントを开けて绝えず発注して、资源モニターのネットIOは1 M/sの流量を表示して、更に1つのクライアントを开けて、やはり1 M/sの流量で、その上その中の1つのクライアントは発注を停止して、后でまた発注します.
回答:winsocketはデフォルトでブロックされているため、accept()、receiveはブロック関数であり、receiveがデータを受信していない場合、プログラムは下へ実行し続けず、socketバッファのデータがいっぱいになると、クライアントがデータを送信することを阻止し、粘着パケットが発生します.トラフィック1 M/sはuiスレッド印刷でCPUが消費されるためです.データの送信に全力を尽くすことができない.
1 mysocket.h
2 mythread.h
3 client.cpp
4 mymain.cpp
5.mysocket.cpp
6 mythread.cpp
1つのクライアントを开けて绝えず発注して、资源モニターのネットIOは1 M/sの流量を表示して、更に1つのクライアントを开けて、やはり1 M/sの流量で、その上その中の1つのクライアントは発注を停止して、后でまた発注します.
回答:winsocketはデフォルトでブロックされているため、accept()、receiveはブロック関数であり、receiveがデータを受信していない場合、プログラムは下へ実行し続けず、socketバッファのデータがいっぱいになると、クライアントがデータを送信することを阻止し、粘着パケットが発生します.トラフィック1 M/sはuiスレッド印刷でCPUが消費されるためです.データの送信に全力を尽くすことができない.
1 mysocket.h
const size_t IP_BUF_SIZE = 65;
#include "mythread.h"
class MySocket : public MyThread{
public:
SOCKET m_socket;
SOCKET m_con;
public:
MySocket();
~MySocket();
void init();
void mybind();
void mylisten();
SOCKET myaccept();
void mysend(char * ch);
void myrecv();
void myclose();
void run();
void myconnect();
};
2 mythread.h
const size_t IP_BUF_SIZE = 65;
#include "mythread.h"
class MySocket : public MyThread{
public:
SOCKET m_socket;
SOCKET m_con;
public:
MySocket();
~MySocket();
void init();
void mybind();
void mylisten();
SOCKET myaccept();
void mysend(char * ch);
void myrecv();
void myclose();
void run();
void myconnect();
};
3 client.cpp
#include
#include
#include "mysocket.h"
enum CMD{
CMD_LOGIN,
CMD_LOGOUT
} ;
struct HeaderData{
int datalegth;
int cmd;
};
struct LoginData{
HeaderData headerdata;
char username[100];
int password;
};
void main(){
LoginData logindata;
logindata.headerdata.datalegth =104;
logindata.headerdata.cmd = CMD_LOGIN;
MySocket * mysocket= new MySocket();
mysocket->init();
mysocket->myconnect();
int i =0;
//std::cout<mysend((char *)&logindata);
i=i+1;
// Sleep(5000);// 5
}
system("pause");
}
4 mymain.cpp
#include
#include
#include "mysocket.h"
void receive(void * socket){
MySocket * mysocket ;
mysocket =(MySocket *)socket;
mysocket->myrecv();
}
void main321(){
MySocket * mysocket= new MySocket();
MySocket * clientsocket = new MySocket();
mysocket->mybind();
mysocket->mylisten();
while(1){
clientsocket->m_socket = mysocket->myaccept();
clientsocket->Start();
//clientsocket->run();
// _beginthread( receive, 0, clientsocket );
// mysocket->myrecv(socket);
clientsocket->myrecv();
}
mysocket->myclose();
system("pause");
}
5.mysocket.cpp
#include
#include
#include
#include
#include "mysocket.h"
#pragma comment(lib, "ws2_32.lib") //socket
struct LoginData{
char username[100];
int password;
};
MySocket::MySocket(){
this->init();
}
MySocket::~MySocket(){
}
void MySocket::init(){
WSADATA wsa_data; //WSADATA , windows socket
int sys_fun_result = 0;
// winsock (ws2_32.dll),MAKEWORD(2, 2) winsock2.2
sys_fun_result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
if (sys_fun_result != 0) {
std::cout << "WSAStartup() function failed: " << sys_fun_result << "
";
system("pause");
return ;
}
m_socket=socket(PF_INET,SOCK_STREAM,0);//
std::cout<myrecv();
}
6 mythread.cpp
#include
#include
#include "mythread.h"
void MyThread::Start( ){
_beginthread( Callback , 0, this );
};
void MyThread::Callback(void * p){
MyThread * obj = (MyThread *) p;
obj->run();
}