SOCKET
来源:互联网 发布:helloworld代码 python 编辑:程序博客网 时间:2024/06/07 03:39
#include <iostream>
#include <winsock2.h>
#include <windows.h>
using namespace std;
void ok(){cout<<"ok "<<WSAGetLastError()<<endl;}
struct sock_list
{
SOCKET sock;
SOCKADDR_IN addr;
int port;
int pid;
char *buf;
int buf_size;
int addr_size;
//
HANDLE hThread;
//
sock_list * next;
};
class goxlsock
{
static bool is_wsa_init;
static bool back_call(goxlsock con);
static bool sub_back_call(goxlsock con);
private:
WSADATA wsd;
HANDLE hThread;
sock_list local,client,*head,*cur;
int max_client,count_client;
int nRet;
int port;
unsigned long ul;
//
fd_set fdread,fdwrite,fdexecept;
int p_id;
public:
goxlsock(char * p_addr,int p_port,int p_max_client);
~goxlsock();
int socksend(char * addr,char * p_buf,int p_buf_size);
int socksend(SOCKET p_sock,char * p_buf,int p_buf_size);
bool sockconnect(char * addr);
//sock_list get_client();
bool start();
private:
bool init();
bool set_fd();
};
bool goxlsock::is_wsa_init = false;
//
goxlsock::goxlsock(char * p_addr,int p_port,int p_max_client)
{
max_client = p_max_client;
count_client = 0;
ul = 1;
port = p_port;
head = new sock_list;
cur = head;
//head->sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//
if(!goxlsock::is_wsa_init)
{
WSAStartup(MAKEWORD(2,2),&wsd);
goxlsock::is_wsa_init = true;
}
//
local.addr.sin_addr.s_addr = inet_addr(p_addr);
local.addr.sin_family = AF_INET;
local.addr.sin_port = htons(p_port);
//
local.sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//
bind(local.sock,(SOCKADDR*)&(local.addr),sizeof(local.addr));
listen(local.sock,max_client);
nRet = ioctlsocket(local.sock,FIONBIO,&ul);
//
//start();
//hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(goxlsock::back_call),(LPVOID)this,0,NULL);
//cout<<WSAGetLastError()<<endl;
}
goxlsock::~goxlsock()
{
closesocket(local.sock);
CloseHandle(hThread);
WSACleanup();
}
bool goxlsock::start()
{
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(goxlsock::back_call),(void *)this,0,NULL);
}
//sock_list goxlsock::get_client(){ return client;}
int goxlsock::socksend(char * addr,char * p_buf,int p_buf_size)
{
//send()
sockconnect(addr);
//send(sock)
}
int goxlsock::socksend(SOCKET p_sock,char * p_buf,int p_buf_size)
{
return send(p_sock,p_buf,p_buf_size,0);
}
bool goxlsock::sockconnect(char * addr)
{
SOCKADDR_IN remote;
remote.sin_family = AF_INET;
remote.sin_port = htons(port);
remote.sin_addr.s_addr = inet_addr(addr);
connect(local.sock,(SOCKADDR*)&remote,sizeof(remote));
}
bool goxlsock::set_fd()
{
int i = 0;
sock_list * t_list;
//
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexecept);
//
FD_SET(local.sock,&fdread);
FD_SET(local.sock,&fdwrite);
FD_SET(local.sock,&fdexecept);
//
t_list = head;
for(i=0;i<count_client;i++)
{
//cout<<count_client<<endl;
//FD_SET(t_list->sock,&fdread);
FD_SET(client.sock,&fdread);
}
//t_list = head;
nRet = select(0,&fdread,&fdwrite,&fdexecept,0);
}
bool goxlsock::back_call(goxlsock con)
{
//cout<<con.p_id<<endl;
int i = 0;
con.cur = new sock_list;
con.head = con.cur;
con.client.sock = 0;
while(true)
{
//ok();
con.set_fd();
//cout<<"ok"<<endl;
if(con.nRet == SOCKET_ERROR)
{
ok();
//cout<<"SOCKET_ERROR Value: "<<SOCKET_ERROR<<endl;
}
//ok();
if(con.nRet>0)
{
if(FD_ISSET(con.local.sock,&(con.fdread)))
{
if(con.client.sock==0)
con.client.sock = accept(con.local.sock,(SOCKADDR*)&(con.client.addr),&(con.client.addr_size));
//send(con.client.sock,"123456",6,0);
con.count_client++;
}
//
//子套接字功能
for(i=0;i<con.count_client;i++)
{
//cout<<con.count_client<<endl;
//if(FD_ISSET(con.cur->sock,&(con.fdread)))
if(FD_ISSET(con.client.sock,&(con.fdread)))
{
con.client.buf = new char[1024];
recv(con.client.sock,con.client.buf,1024,0);
//con.send(con.client.sock,"123",3);
con.client.hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)goxlsock::sub_back_call,(void*)&con,0,NULL);
//cout<<con.client.buf<<endl;
}
}
//ok();
}
}
return true;
}
bool goxlsock::sub_back_call(goxlsock con)
{
int n = 0;
cout<<con.client.buf<<endl;
n = send(con.client.sock,"接收成功",8,0);
//cout<<n<<endl;
//con.send(con.client.sock,"45679",6);
//while(true)
{
//cout<<con.pid<<endl;
//con.cur->sock = accept(con.local.sock,(SOCKADDR*)&(con.cur->addr),&(con.cur->addr_size));
//con.client.sock = accept(con.local.sock,(SOCKADDR*)&(con.client.addr),&(con.client.addr_size));
//ok();
}
}
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
DWORD send_msg(goxlsock p)
{
//p.socksend(p.get_client().sock,"123",3);
}
int main(int argc, char *argv[])
{
char addr[15];
char buf[1024];
cin>>addr;
//sprintf(addr,"127.0.0.1");
goxlsock test(addr,1234,8);
///
test.start();
//
//CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send_msg,(void*)&test,0,NULL);
//while(1)
{
}
system("pause");
return 0;
}
- socket
- socket
- Socket
- Socket
- Socket
- Socket
- Socket
- Socket
- socket
- Socket
- Socket
- Socket
- Socket
- socket
- socket
- socket
- socket
- socket
- shell参数
- uCOS-II是如何避免调整堆栈指针的?
- 浪费时间
- Use volatile judiciously
- grails学习笔记——Groovy与java的比较
- SOCKET
- Linux操作系统定时任务系统 Cron
- 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
- 库操作工具以及命令
- 关于手机应用到Samsung Galaxy Tab屏幕的适应问题解决
- HTML5设计原理-----------Jeremy Keith在 Fronteers 2010 上的主题演讲
- 根据图幅号(新图幅号)计算左下角点坐标的方法及代码(C#)
- Place volatile accurately
- 无题