socket的select的问题。 哪位有在客户端使用select的完整例程?多谢了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 某个socket封装类的方法int CWzSocket::Send(LPCSTR lpszBuf, const int nSize, const int nSecs){ assert(m_socket != NULL); // 如果客户方取消读,则返回值将小于nSize FD_SET fd = {1, m_socket}; TIMEVAL tv = {nSecs, 0}; if(select(0, NULL, &fd, NULL, &tv) == 0) { return -2;//超时 } int nBytesSent; if((nBytesSent = send(m_socket, lpszBuf, nSize, 0)) == SOCKET_ERROR) { return -1; } return nBytesSent;}int CWzSocket::Receive(LPSTR lpszBuf, const int nSize, const int nSecs){ assert(m_socket != NULL); FD_SET fd = {1, m_socket}; TIMEVAL tv = {nSecs, 0}; if(select(0, &fd, NULL, NULL, &tv) == 0) { return -2;//接收超时 } int nBytesReceived; if((nBytesReceived = recv(m_socket, lpszBuf, nSize, 0)) == SOCKET_ERROR) { return -1; } return nBytesReceived;} orbit(吹泡泡的小猫) :把您这个socket封装类的全部代码给我看看吧。 http://www.vckbase.com/code/downcode.asp?id=2137 在客户端的程序为: #include <winsock2.h>#include <stdio.h>#include <stdlib.h>#include <windows.h> #pragma comment(lib,"ws2_32.lib")#define DEFAULT_PORT 5150#define DEFAULT_BUFFER 4096int iPort = DEFAULT_PORT;BOOL bInterface = FALSE, bRecvOnly = FALSE;char szAddress[128];//int main(int argc,char **argv)int main( ){ WSADATA wsd; SOCKET sClient; int RecvRet,ret; struct sockaddr_in server; unsigned long ul =1;/////////////////////// struct hostent *host = NULL; char szBuff[DEFAULT_BUFFER]; fd_set fdread; TIMEVAL tm; tm.tv_sec = 5; tm.tv_usec = 0;////////////////////// if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) { printf("Failed to load Winsock!\n"); return 1; } sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if(sClient == SOCKET_ERROR) { printf("socket() failed:%d\n",WSAGetLastError()); return 1; } server.sin_family = AF_INET; server.sin_port = htons(iPort); server.sin_addr.s_addr = inet_addr("192.168.136.102");//ip address if(server.sin_addr.s_addr == INADDR_NONE) { host = gethostbyname("192.168.136.102"); printf("sb"); if(host == NULL) { printf("Unable to resolve server:%s\n","192.168.136.102"); return 1; } CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length); } if(connect(sClient,(struct sockaddr*)&server,sizeof(server)) == SOCKET_ERROR) { printf("connect()failed:%d\n",WSAGetLastError()); return 1; } //set noblock model if (ioctlsocket(sClient, FIONBIO, &ul) == SOCKET_ERROR) { printf("ioctlsocket() failed with error %d\n", WSAGetLastError()); return -1; } FD_ZERO(&fdread); FD_SET(sClient,&fdread); select(0,&fdread,NULL,NULL,NULL); while(1) { if(FD_ISSET(sClient,&fdread)) { RecvRet = recv(sClient,szBuff,DEFAULT_BUFFER,0); if(RecvRet == 0) break; else if (RecvRet == SOCKET_ERROR) { printf("recv()failed:%d\n",WSAGetLastError()); break; } szBuff[RecvRet] = '\0'; printf("RECV :%s\n",szBuff); } } closesocket(sClient); WSACleanup(); return 0;}我在服务器端发送了十次,可是我的客户端只能接受到1次后就说接受失败,错误代码为:10035。这是哪里错了? 奇怪的问题,不能给控件添加控制变量了。 高分求助,windows和linux通过TCP互传文件的问题 怎样设置一个CEdit的控件的背景色(如红色)? 前辈,帮忙! 为什么CreateProcess后不成功 线程问题 VB DDE VC 何用之? 关于vc中ole的一个问题 ShowWindow()有没有累积效应? 伤痕!!男子汉的勋章!!(关于多任务编程的噩梦般的颤抖难题) LOWORD这个宏是在什么情况下会用到。 动态创建的CEdit控件为何不支持ctrl C
int CWzSocket::Send(LPCSTR lpszBuf, const int nSize, const int nSecs)
{
assert(m_socket != NULL);
// 如果客户方取消读,则返回值将小于nSize
FD_SET fd = {1, m_socket};
TIMEVAL tv = {nSecs, 0};
if(select(0, NULL, &fd, NULL, &tv) == 0)
{
return -2;//超时
} int nBytesSent;
if((nBytesSent = send(m_socket, lpszBuf, nSize, 0)) == SOCKET_ERROR)
{
return -1;
} return nBytesSent;
}int CWzSocket::Receive(LPSTR lpszBuf, const int nSize, const int nSecs)
{
assert(m_socket != NULL);
FD_SET fd = {1, m_socket};
TIMEVAL tv = {nSecs, 0};
if(select(0, &fd, NULL, NULL, &tv) == 0)
{
return -2;//接收超时
} int nBytesReceived;
if((nBytesReceived = recv(m_socket, lpszBuf, nSize, 0)) == SOCKET_ERROR)
{
return -1;
}
return nBytesReceived;
}
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h> #pragma comment(lib,"ws2_32.lib")
#define DEFAULT_PORT 5150
#define DEFAULT_BUFFER 4096int iPort = DEFAULT_PORT;
BOOL bInterface = FALSE,
bRecvOnly = FALSE;
char szAddress[128];//int main(int argc,char **argv)
int main( )
{
WSADATA wsd;
SOCKET sClient;
int RecvRet,ret; struct sockaddr_in server;
unsigned long ul =1;
///////////////////////
struct hostent *host = NULL;
char szBuff[DEFAULT_BUFFER];
fd_set fdread; TIMEVAL tm;
tm.tv_sec = 5;
tm.tv_usec = 0;////////////////////// if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
printf("Failed to load Winsock!\n");
return 1;
} sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if(sClient == SOCKET_ERROR)
{
printf("socket() failed:%d\n",WSAGetLastError());
return 1;
} server.sin_family = AF_INET;
server.sin_port = htons(iPort);
server.sin_addr.s_addr = inet_addr("192.168.136.102");//ip address
if(server.sin_addr.s_addr == INADDR_NONE)
{
host = gethostbyname("192.168.136.102");
printf("sb");
if(host == NULL)
{
printf("Unable to resolve server:%s\n","192.168.136.102");
return 1;
}
CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length);
}
if(connect(sClient,(struct sockaddr*)&server,sizeof(server)) == SOCKET_ERROR)
{
printf("connect()failed:%d\n",WSAGetLastError());
return 1;
}
//set noblock model
if (ioctlsocket(sClient, FIONBIO, &ul) == SOCKET_ERROR)
{
printf("ioctlsocket() failed with error %d\n", WSAGetLastError());
return -1;
} FD_ZERO(&fdread);
FD_SET(sClient,&fdread);
select(0,&fdread,NULL,NULL,NULL);
while(1)
{
if(FD_ISSET(sClient,&fdread))
{
RecvRet = recv(sClient,szBuff,DEFAULT_BUFFER,0);
if(RecvRet == 0)
break;
else if (RecvRet == SOCKET_ERROR)
{
printf("recv()failed:%d\n",WSAGetLastError());
break;
}
szBuff[RecvRet] = '\0';
printf("RECV :%s\n",szBuff);
}
}
closesocket(sClient);
WSACleanup();
return 0;
}我在服务器端发送了十次,可是我的客户端只能接受到1次后就说接受失败,错误代码为:10035。这是哪里错了?