为何我的accept不好用呢?
duper 2006-08-26 01:45:44 小弟初学socket
做了个简单的聊天程序
用的是win32 console application
代码如下:
1.cpp
----------------------------------
#include "stdafx.h"
#include "Comm.h"
#include <stdio.h>
int main(int argc, char* argv[])
{
CComm myComm;
myComm.OnInitDialog();
return 0;
}
-----------------------------------
Comm.h
-----------------------------------
#ifndef _COMM_H_
#define _COMM_H_
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#define socklen_t int
#pragma comment(lib, "wsock32.lib")
class CComm
{
public:
SOCKET clie;
int getcount();
SOCKET msgsock[50];
static void *Thread(void *data);
int addlen;
bool OnInitDialog();
CComm();
virtual ~CComm();
private:
sockaddr_in serv;
SOCKET SSocket;
};
#endif // #define _CCOMM_H_
------------------------------------
Comm.cpp
------------------------------------
// Comm.cpp: implementation of the CComm class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Comm.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CComm::CComm()
{
SSocket = INVALID_SOCKET;
#ifdef _WIN32
WORD VersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
WSAStartup(VersionRequested, &wsaData);
if (wsaData.wVersion != VersionRequested)
{
printf("version\n");
fflush(0);
}
printf("WSAStartup\n");
#endif
}
CComm::~CComm()
{
for (int i=0;i<50;i++)
if (msgsock[i]!=NULL)
{
send(msgsock[i],"Disconnected",100,0);
}
if (SSocket != INVALID_SOCKET)
{
closesocket(SSocket);
}
#ifdef _WIN32
WSACleanup();
#endif
}
bool CComm::OnInitDialog()
{
for (int i=0;i<50;i++)
{
msgsock[i]=NULL;
}
SSocket = socket(AF_INET, SOCK_STREAM, 0);
if (SSocket == INVALID_SOCKET)
{
printf("socket创建失败");
fflush(0);
return false;
}
printf("socket创建ok\n");
serv.sin_addr.s_addr = htonl(INADDR_ANY);
serv.sin_family = AF_INET;
serv.sin_port = 5000;
addlen = sizeof(serv);
if (bind(SSocket, (struct sockaddr*)&serv, addlen) != 0)
{
printf("绑定错误\n");
fflush(0);
closesocket(SSocket);
return false;
}
printf("绑定ok\n");
listen(SSocket, 5);
printf("侦听OK\n");
int ThreadID;
DWORD thread;
ThreadID = (int)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(CComm::Thread), (void *)this, 0, &thread);
ThreadID = ThreadID ? 0:1;
if (ThreadID)
{
printf("线程创建失败\n");
return false;
}
else
{
return true;
}
return true;
}
void *CComm::Thread(void *data)
{
HANDLE hIOMutex1= CreateMutex (NULL, FALSE, NULL);
WaitForSingleObject( hIOMutex1, INFINITE );
CComm *Comm = (CComm *)data;
char buff[100];
int s=1,msgcount,loop=1,flag=0;
msgcount = Comm->getcount();
if (msgcount == -1)
{
loop=0;
}
if (loop)
{
Comm->msgsock[msgcount] = accept(Comm->SSocket, (sockaddr*)&Comm->serv, &Comm->addlen);
if (Comm->msgsock[msgcount] == INVALID_SOCKET)
{
printf("accept错误\n");
}
else
{
printf("连接成功");
while (s != SOCKET_ERROR)
{
s = recv(Comm->msgsock[msgcount], buff, 100, 0);
if (s != SOCKET_ERROR)
{
printf("%s\n", buff);
}
}
printf("断开\n");
Comm->msgsock[msgcount] = NULL;
for (int i=0; i<50; i++)
{
if (Comm->msgsock[i] != NULL)
{
flag = 1;
}
}
closesocket(Comm->msgsock[msgcount]);
}
}
ReleaseMutex(hIOMutex1);
return 0;
}
int CComm::getcount()
{
for (int i=0;i<50;i++)
{
if (msgsock[i]==NULL)
return i;
}
return -1;
}
-------------------------------------
为何我的Comm->msgsock[msgcount] = accept(Comm->SSocket, (sockaddr*)&Comm->serv, &Comm->addlen)得到的值是-1呢.
哪里差了些什么吗?
请大哥们指点.
最好符上详细代码和说明.
小弟万分感谢