为何在线程里使用recv不好用呢?

duper 2006-08-24 09:53:40
小弟初学socket
做了个简单的聊天程序
用的是win32 console application
代码如下:

2.cpp:
------------------------------------------------
#include "stdafx.h"
#include "Comm.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
char ip[16];
char *ipaddress=ip;

printf("请输入对方IP:");
scanf("%s",ip); //手动输入对方IP

CComm myComm;
myComm.OnInitDialog(ipaddress);
printf("服务器端已连接.进入聊天\n");


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:
static void *Thread(void *data);
int ee;
int addlen;
bool OnInitDialog(char *ipaddress);
CComm();
virtual ~CComm();
SOCKET CSocket;

private:
int count;
sockaddr_in clie;
};

#endif // #define _CCOMM_H_

-----------------------------------------------
Comm.cpp
-----------------------------------------------
// Comm.cpp: implementation of the CComm class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Comm.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CComm::CComm()
{
CSocket = 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()
{
if (CSocket != INVALID_SOCKET)
{
closesocket(CSocket);
}
#ifdef _WIN32
WSACleanup();
#endif
}

bool CComm::OnInitDialog(char *ipaddress)
{
printf("%s\n",ipaddress);
CSocket = socket(AF_INET, SOCK_STREAM, 0);

if (CSocket == INVALID_SOCKET)
{
printf("socket创建失败\n");
fflush(0);
return false;
}
printf("socket创建ok\n\n");

clie.sin_addr.s_addr = inet_addr(ipaddress);
clie.sin_family = AF_INET;
clie.sin_port = 5000;
addlen = sizeof(clie);

printf("socket=%d\n",CSocket);
printf("clie=%d\n",clie);
printf("addlen=%d\n",addlen);


ee = 1;
/*
printf("ee=%d\n",ee);
while (connect(CSocket, (sockaddr*)&clie, addlen) && ee != 0)
{
printf("等待连接中......\n");
}
*/

//int s=1;
//char buff[100];

while (connect(CSocket, (sockaddr*)&clie, addlen) && ee != 0)
{
printf("等待连接中......\n");
}
if (ee == 1)
{
printf("connect....ok\n");
printf("连接成功!\n");
send(CSocket, "客户端连接!\n", 100, 0);
}
/*
while (s != SOCKET_ERROR && ee != 0)
{
s = recv(CSocket, buff, 100, 0);
printf("%d\n,s");
if (s != SOCKET_ERROR && ee != 0)
{
printf("%s\n", buff);
}
}

printf("服务端不存在\n");
closesocket(CSocket);
*/

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;
}



----------------------------------


如果在线程外使用recv得到的值是0程序正常进入循环收到服务器发送的BUFF
但放到线程里就得到-1
请高手指点.
void *CComm::Thread(void *data)
{
CComm *Comm = (CComm *)data;
int s=1;
char buff[100];

while (s != SOCKET_ERROR && Comm->ee != 0)
{
s = recv(Comm->CSocket,buff,100,0);
printf("%d\n,s");
if (s != SOCKET_ERROR && Comm->ee != 0)
{
printf("%s\n", buff);
}
}
return 0;
}
...全文
343 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
duper 2006-08-25
  • 打赏
  • 举报
回复
小弟在此谢谢过两位.

感谢kagezhao(kage)
朝阳群众001 2006-08-24
  • 打赏
  • 举报
回复
printf("服务器端已连接.进入聊天\n");
之后main函数执行中止,myComm 对象析构了,发生WSACleanup(),所以通讯线程收不到数据
如果recv没写在线程里,因为这个函数是阻塞的,没受到数据前主线程不会退出。

所以改为在主线程 WaitForSingleObject() 等通讯线程退出,总之别先退出
mango279 2006-08-24
  • 打赏
  • 举报
回复
太长,没仔细看,但是
clie.sin_addr.s_addr = inet_addr(ipaddress);
clie.sin_family = AF_INET;
clie.sin_port = 5000;
addlen = sizeof(clie);

应该是
clie.sin_addr.s_addr = inet_addr(ipaddress);
clie.sin_family = AF_INET;
clie.sin_port = htons(5000);
addlen = sizeof(clie);
吧。

你现在的程序tcp连接成功了吗?

18,357

社区成员

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

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