我的程序这样写的:
监听某一端口
如果来了一个数据 则建立一个socket ,并新建一个线程,此线程单独处理这个socket的数据
--问题--
多线程中使用recv没有什么问题。。 可以各自正常运作。
但如果send 的时候,只有第一个send的线程将数据发出去,其他线程就发不出去了。
这个是不是端口被占用了呢? 请问该如何处理。。--部分代码--WSADATA wsaData;
int iRet=WSAStartup(MAKEWORD(2,2),&wsaData);
if(iRet!=NO_ERROR)
{
erroroutput("wsastartup失败");
return;
}
SOCKET m_socket;
m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_socket==INVALID_SOCKET)
{
erroroutput("socket创建失败");
WSACleanup();
return ;
}
//创建一个端口 //找到本机IP char HostName[80];
LPHOSTENT lpHostEnt;
struct in_addr addr;
if(gethostname(HostName,sizeof(HostName))==SOCKET_ERROR)
{ // 得到本主机名
erroroutput("获取主机名失败");
return;
}
lpHostEnt=gethostbyname(HostName);//利用得到的主机名去获得主机结构
if(!lpHostEnt)
{
erroroutput("获取IP失败");
return ;
}
memcpy(&addr,lpHostEnt->h_addr_list[1],sizeof(in_addr)); CString myip=inet_ntoa(addr);
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=inet_addr(myip);
service.sin_port=htons(PORT);
if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
erroroutput("端口创建失败");
closesocket(m_socket);
return ;
}
else
{
}
//监听一个连接
if(listen(m_socket,SOMAXCONN)==SOCKET_ERROR)
erroroutput("端口监听失败");
else
erroroutput(myip+"上的端口创建成功,现已开始监听端口");
//accept a connection
SOCKET AcceptSocket;
//开始等待连接
while(1)
{
socketdb tsocket;//构造一个socket的结构体
int addrlen;
addrlen=sizeof(tsocket.name); AcceptSocket=SOCKET_ERROR;
while(AcceptSocket==SOCKET_ERROR)
{
AcceptSocket=accept(m_socket,(struct sockaddr *)&tsocket.name,&addrlen);
}
tsocket.socketname=AcceptSocket; DWORD dwThreadId;
HANDLE hThread;
hThread=CreateThread(NULL,NULL,AnswerThread,(LPVOID)&tsocket,0,&dwThreadId);
if(hThread==NULL)
{
erroroutput("创建接受线程失败");
}
else
{
//erroroutput("创建接受线程成功" );
}
}
return ; -------线程部分-----------DWORD WINAPI AnswerThread(LPVOID lparam)
{
socketdb *clientsocketsc=(socketdb *)lparam;
SOCKET ClientSocket=clientsocketsc->socketname;
int bytesRecv=0;
byte recvbuf[SIZEDATA]=""; //每次接收到的数据包的缓存
int newpage=0; //文件缓存中的字节数
byte newpagebuf[SIZEFILE]=""; //每次的数据文件的缓存
int pagesize=0;
//加入BLOB类型的数据
CString reslut="";
int insertok=0;
while( bytesRecv != SOCKET_ERROR && insertok==0)
{ //Receiving Data
bytesRecv=recv(ClientSocket,(char *)recvbuf,sizeof(recvbuf),0);
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
{
erroroutput("连接断开");
break;
}
监听某一端口
如果来了一个数据 则建立一个socket ,并新建一个线程,此线程单独处理这个socket的数据
--问题--
多线程中使用recv没有什么问题。。 可以各自正常运作。
但如果send 的时候,只有第一个send的线程将数据发出去,其他线程就发不出去了。
这个是不是端口被占用了呢? 请问该如何处理。。--部分代码--WSADATA wsaData;
int iRet=WSAStartup(MAKEWORD(2,2),&wsaData);
if(iRet!=NO_ERROR)
{
erroroutput("wsastartup失败");
return;
}
SOCKET m_socket;
m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_socket==INVALID_SOCKET)
{
erroroutput("socket创建失败");
WSACleanup();
return ;
}
//创建一个端口 //找到本机IP char HostName[80];
LPHOSTENT lpHostEnt;
struct in_addr addr;
if(gethostname(HostName,sizeof(HostName))==SOCKET_ERROR)
{ // 得到本主机名
erroroutput("获取主机名失败");
return;
}
lpHostEnt=gethostbyname(HostName);//利用得到的主机名去获得主机结构
if(!lpHostEnt)
{
erroroutput("获取IP失败");
return ;
}
memcpy(&addr,lpHostEnt->h_addr_list[1],sizeof(in_addr)); CString myip=inet_ntoa(addr);
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=inet_addr(myip);
service.sin_port=htons(PORT);
if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
erroroutput("端口创建失败");
closesocket(m_socket);
return ;
}
else
{
}
//监听一个连接
if(listen(m_socket,SOMAXCONN)==SOCKET_ERROR)
erroroutput("端口监听失败");
else
erroroutput(myip+"上的端口创建成功,现已开始监听端口");
//accept a connection
SOCKET AcceptSocket;
//开始等待连接
while(1)
{
socketdb tsocket;//构造一个socket的结构体
int addrlen;
addrlen=sizeof(tsocket.name); AcceptSocket=SOCKET_ERROR;
while(AcceptSocket==SOCKET_ERROR)
{
AcceptSocket=accept(m_socket,(struct sockaddr *)&tsocket.name,&addrlen);
}
tsocket.socketname=AcceptSocket; DWORD dwThreadId;
HANDLE hThread;
hThread=CreateThread(NULL,NULL,AnswerThread,(LPVOID)&tsocket,0,&dwThreadId);
if(hThread==NULL)
{
erroroutput("创建接受线程失败");
}
else
{
//erroroutput("创建接受线程成功" );
}
}
return ; -------线程部分-----------DWORD WINAPI AnswerThread(LPVOID lparam)
{
socketdb *clientsocketsc=(socketdb *)lparam;
SOCKET ClientSocket=clientsocketsc->socketname;
int bytesRecv=0;
byte recvbuf[SIZEDATA]=""; //每次接收到的数据包的缓存
int newpage=0; //文件缓存中的字节数
byte newpagebuf[SIZEFILE]=""; //每次的数据文件的缓存
int pagesize=0;
//加入BLOB类型的数据
CString reslut="";
int insertok=0;
while( bytesRecv != SOCKET_ERROR && insertok==0)
{ //Receiving Data
bytesRecv=recv(ClientSocket,(char *)recvbuf,sizeof(recvbuf),0);
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
{
erroroutput("连接断开");
break;
}
bytesSent = send(ClientSocket,(char *)sendbuf,28,0);erroroutput("已经将数据包发送出去,"+tip+":"+temp);
最容易产生此类问题的情况是,两端都在send