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

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();
}