为何我的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呢.
哪里差了些什么吗?
请大哥们指点.
最好符上详细代码和说明.
小弟万分感谢
...全文
152 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nuaawenlin 2006-08-26
  • 打赏
  • 举报
回复
Comm->msgsock[msgcount] = accept(Comm->SSocket, (sockaddr*)&Comm->serv, &Comm->addlen)
//////////////////////////////////////////////////////////////////////////////////////////

Comm->addlen = sizeof(Comm->serv);
Comm->msgsock[msgcount] = accept(Comm->SSocket, (sockaddr*)&Comm->serv, &Comm->addlen)
DJay 2006-08-26
  • 打赏
  • 举报
回复
差了WSAGetLastError咯,返回-1,也就是出错拉,你应该调用WSAGetLastError得到错误号,查MSDN你就知道是哪里错咯。

cloudgamer 2006-08-26
  • 打赏
  • 举报
回复
帮顶

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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