在win下用Libev作TCP server的问题

guolisen 2012-12-13 02:45:52
用Libev作TCP server的问题

我载winsock下用libev处理连接(select),可是每次建立TCP连接,libev都回调3次,请问是正常的吗,回调3次,其中只有一次accept返回成功。返回的那个recv也读不到数据返回-1.

下面是libev的回调,我在accpet后起线程去recv。


void io_callback(LoopHandle loop, CBHandle w, int revents)
{

SOCKET fd = w->fd;
#ifdef LWDP_PLATFORM_DEF_WIN32
fd = _get_osfhandle (w->fd);
#endif

struct sockaddr_in addr;
int addr_size = sizeof(addr);
int* accept_conn = (int*)malloc(sizeof(int));
while ((*accept_conn = accept(fd, (struct sockaddr *)&addr, &addr_size)) < 0)
{
if (errno == EAGAIN)
{
//these are transient, so don't log anything.
continue;
}
else
{
LWDP_LOG_PRINT("TCPSERVER", LWDP_LOG_MGR::ERR,
"Accept Error.");
return;
}
}


pthread_t t;
int result;

result = pthread_create(&t, NULL, thread_callback, accept_conn);
if(result != 0){
LWDP_LOG_PRINT("TCPSERVER", LWDP_LOG_MGR::ERR,
"Can't Create Thread Ret: %d\n", result);
return;
}

result = pthread_detach(t);
if(result != 0){
LWDP_LOG_PRINT("TCPSERVER", LWDP_LOG_MGR::ERR,
"Can't Detach Thread Ret: %d\n", result);
return;
}

}


发送端非常简单就是发字符串

#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
using namespace std;
#define SERVPORT 12135 /*服务器监听端口号*/
#define DEST_IP "127.0.0.1"
#define MAXDATASIZE 100

int _tmain(int argc, _TCHAR* argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
struct sockaddr_in dest_addr; /* 目的地址*/

WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,0);
err = WSAStartup(wVersionRequested,&wsaData);
if (0 != err)
{
cout<<"Socket failed";
return 0;

}
if (LOBYTE(wsaData.wVersion)!= 2 || HIBYTE(wsaData.wVersion) != 0)
{
WSACleanup();
return 0;
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket创建出错!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
/* serv_addr.sin_addr = *((struct in_addr *)host->h_addr);*/
serv_addr.sin_addr.s_addr = inet_addr(DEST_IP);
memset( &(serv_addr.sin_zero),0,8);
if (connect(sockfd, (struct sockaddr *) &serv_addr, \
sizeof(struct sockaddr)) == -1) {
perror("connect出错!");
//exit(1);
}
char szMsg[] = "hao";
int nlen = sizeof(serv_addr);
char* msg = "Hello, are connected!";
int uIndex = 0;
while (1)
{
Sleep(5000);
if (send(sockfd, msg, sizeof(msg), 0) == -1)
{
cout<<WSAGetLastError()<<endl;
closesocket(sockfd);
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket创建出错!");
exit(1);
}
if (connect(sockfd, (struct sockaddr *) &serv_addr, \
sizeof(struct sockaddr)) == -1)
{
perror("connect出错!");
continue;
}
}
else
{
cout<<uIndex++<<":an TCP package is sended"<<endl;
continue;
}
if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) !=-1)
{
buf[recvbytes] = '\0';
printf( "Received: %s",buf);
}

}

closesocket(sockfd);

return 0;
}




...全文
316 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
guolisen 2012-12-13
  • 打赏
  • 举报
回复
查了一下,recv返回的是WSAEWOULDBLOCK,但是不停循环recv就卡死在那了

4,390

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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