一个多线程socket的问题

IanYang1987 2011-02-24 10:17:12
这个是我的answer线程,我希望可以当接收到“shutdown”的时候,可以让主函数中的listen的while(1)终止 并且
closesocket( AcceptSocket);
WSACleanup();

unsigned __stdcall AnswerThread(LPVOID lparam)
{
SOCKET ClientSocket=(SOCKET)(LPVOID)lparam;
int bytesRecv;
char sendbuf[32]="";
char recvbuf[32]="";

while(1)
{
bytesRecv=SOCKET_ERROR;
for(int i=0;i<32;i++)
{ recvbuf[i]='\0'; }
while(bytesRecv==SOCKET_ERROR)
{ //Receiving Data
bytesRecv=recv(ClientSocket,recvbuf,32,0);
}
if(strcmp(recvbuf,"close")==0)
{
strcpy(sendbuf,"Closed Session");
send(ClientSocket,sendbuf,32,0);
printf("Closed Session\n");
_endthreadex( 0 );
return 0;
}
if(strcmp(recvbuf,"shutdown")==0)
{
strcpy(sendbuf,"Closed Session, Server Shutdown");
send(ClientSocket,sendbuf,32,0);
printf("Closed Session\n");
printf("Server Shutdown");
closesocket( ClientSocket);

_endthreadex( 0 );
return 0;
}
send(ClientSocket,recvbuf,strlen(recvbuf),0);
printf("%s\n",recvbuf);
Sleep(0);
}
return 1;
}

多谢各位大哥了。。
...全文
104 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
IanYang1987 2011-02-28
  • 打赏
  • 举报
回复
CSDN的大哥不给力啊。。 这问题的答案是可以在线程里WSACleanup()
sincere_zhanghx 2011-02-24
  • 打赏
  • 举报
回复
你可以试试以下几种方法:

1 直接结束主程序什么也不管 在收到shutdown时直接exit(0)

2 回调函数,当收到shutdown通知主程序

3 传入指针,改写指针指向的标志,但涉及到主线程和工作线程的配合,要注意锁。
qq120848369 2011-02-24
  • 打赏
  • 举报
回复
启动线程的时候,给它传入一个指针,线程退出时给指针指向的值赋值即可.

比如:

char *str=new char[10];
CreateThread( ......AnswerThread,(void*)str);
IanYang1987 2011-02-24
  • 打赏
  • 举报
回复
我的意思是当接收到shutdown的时候 把整个程序结束掉。。 所以需要返回一个值到主函数,我又不想用全局变量,会扣分。。 有方法没?
look_back 2011-02-24
  • 打赏
  • 举报
回复
想干嘛呢?
zyyoung 2011-02-24
  • 打赏
  • 举报
回复
while(bytesRecv==SOCKET_ERROR) 去掉,

怎么没有考虑粘包的可能行
zyyoung 2011-02-24
  • 打赏
  • 举报
回复
recvbuf[0]='\0';即可
zyyoung 2011-02-24
  • 打赏
  • 举报
回复
SOCKET *ClientSocket=(SOCKET*)lparam;
pmars 2011-02-24
  • 打赏
  • 举报
回复
有什么问题??
IanYang1987 2011-02-24
  • 打赏
  • 举报
回复
各位能说的具体点么,我创建线程的语句是这样的,
while(1)
{
printf("Waiting for a client to connect...\n");
AcceptSocket=SOCKET_ERROR;
while(AcceptSocket==SOCKET_ERROR) //accept connections
{
AcceptSocket=accept(m_socket,(struct sockaddr*)&client[countTh],NULL);
}
printf("Client Connected.\n");

/* unsigned int dwThreadId; */
HANDLE hThread;
hThread= (HANDLE)_beginthreadex( NULL, 0, &AnswerThread,(LPVOID)AcceptSocket, 0, &threadId[countTh]); //create thread for new connection

//CreateThread(NULL,NULL, AnswerThread,(LPVOID)AcceptSocket,0,&dwThreadId);
if(hThread==NULL)
{
printf("CreatThread AnswerThread() failed.\n");
}
else
{
printf("Create New Thread OK.\n");

printf("Current session:\tClient IP\tThreadID\n"); //display connection informations.
for(int i=0;i<=countTh;i++)
{
printf("\t\t\t%s\t%d\n",inet_ntoa(client[countTh].sin_addr),threadId[countTh]);
}
countTh++;
}
如果线程退出了主函数能得到返回的指针么,怎么得到那个指针。。
赵4老师 2011-02-24
  • 打赏
  • 举报
回复
exit(0);

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧