我的代码出现不知道对不对,请大家看看 多多指教

peter9606 2004-04-01 10:40:28
CString SOCKET_COMMON_MAGIC = "SGM";
sockaddr_in serverAddr;
int nRet ;
int nEc ;
SgmHeader sgmHeader1 ;
SgmHeader sgmHeader2 ;
RplHeader rplHeader ;

WORD wVersion = MAKEWORD(1,1) ;
WSADATA wsaData ;

nRet = WSAStartup(wVersion,&wsaData) ;


serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(m_Port);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);


if (nRet != 0) {
WSACleanup() ;
::AfxMessageBox("Socket Load Error !",MB_OK|MB_ICONERROR);
return -1 ;
}

if (wVersion != wsaData.wVersion) {
WSACleanup() ;
::AfxMessageBox("Socket Version Not Match Error !",MB_OK|MB_ICONERROR);
return -1 ;
}

m_ListeningSocket = socket (AF_INET,SOCK_STREAM,IPPROTO_TCP) ;

if (m_ListeningSocket < 0) {
WSACleanup() ;
::AfxMessageBox("Create ListeningSocket Error !",MB_OK|MB_ICONERROR);
return -1 ;
}

nRet = bind(m_ListeningSocket,(SOCKADDR *)&serverAddr,sizeof(serverAddr));

if(nRet == SOCKET_ERROR){
closesocket(m_ListeningSocket);
WSACleanup();
::AfxMessageBox("Bind Socket Error !",MB_OK|MB_ICONERROR);
return -1;
}

listen(m_ListeningSocket,5);



char s_buff_h[100] ;
char s_buff_d[5000] ;
char s_buff[300000] ;
char s_buff_tmp[5000] ;
char s_buff_send[300000];
char s_buff_s[5000] ;
unsigned short FrameMax =1;
unsigned short FrameNum =1;
int nSize = 0 ;
int nSize_i = 0 ;
int nSize_r = 0 ;
int nSize_a = 0 ;

unsigned short nFrameCnt =1;
unsigned short nFrameMax ;
int nP = 0 ;
int sp_len ;
int nData ;
int nTemp = 0 ;
time_t ltime ;

DWORD time1,time2 ;

WORD w ;
DWORD ww ;

BOOL Frame_flg = TRUE ;

fd_set readfds ;
readfds.fd_count = 1 ;
readfds.fd_array[0] = m_ListeningSocket ;

const char FAR* optival ;
int nByte = 300000 ;

optival = (const char *)&nByte ;
setsockopt (m_ListeningSocket,SOL_SOCKET,SO_RCVBUF,optival,4) ;

u_long FAR argp ;
argp = 1 ;
ioctlsocket (m_ListeningSocket,FIONBIO,&argp) ;

while (1) {

if (select (0,&readfds,NULL,NULL,NULL) == 1) {
nSize = 48 ;
nSize_a = 0 ;

::AfxMessageBox("Received!",MB_OK|MB_ICONERROR);

//Receive the SGM Common Header
while (1) {
nRet = recv(m_ListeningSocket,&s_buff_h[nSize_a],(nSize - nSize_a),0) ;

if (nRet == 0) {
closesocket(m_ListeningSocket);
WSACleanup();
::AfxMessageBox("Receive NULL Error !",MB_OK|MB_ICONERROR);
return FALSE ;
}
if (nRet == SOCKET_ERROR) {
nEc = WSAGetLastError() ;
if (nEc != WSAEWOULDBLOCK) {
closesocket(m_ListeningSocket);
WSACleanup();
::AfxMessageBox("Block Error !",MB_OK|MB_ICONERROR);
return FALSE ;
} else {
continue ;
}
}
nSize_a += nRet ;
if (nSize_a == nSize) {
break;
}
}//End of receive SGM Common Header

.....下面还有一些处理,但是前面的处理我不知道对不对
select这样用对不对呀?
...全文
68 点赞 收藏 4
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xstring 2004-04-01
我在你另外的一贴中回复了
回复
peter9606 2004-04-01
不是的
问题不出现在这里
我问的是 这样写的Winsock程序的主要流程是否有问题
是不是在非阻塞模式的情况下 ...

不好意思,阻塞模式和非阻塞模式 偶都分不清楚

用了select的就是阻塞模式了么?如果是这样的话那么:
阻塞模式还需要不需要listen函数了呢?
是不是阻塞模式下不需要accept了呢?

回复
xstring 2004-04-01
有问题,你用了non-blocking socket

但你的程序结构是这样的
while (1)
{
if (select () == 1)
{
nsize_a = 0;
nsize = 48;
while (1)
{
int nret = recv ();
nsize_a += nret;
if (nsize_a == nsize)
break;
}
};
};
因为while循环,所以recv可能在select返回后被执行多次
但是,有可能在第一次recv的时候就将缓冲区内的数据都取走了,
然后以后的recv就会报错了。

你应该用这样的结构
nsize = 48;
nsize_a = 0;
while (1)
{
if (select () == 1)
{
int nret = recv ();
nsize_a += nret;
};
if (nsize_a == nsize)
{
// 做你要做的事情
...
// 事情做完了,重置nsize和nsize_a;
nsize_a = 0;
nsize = 48;
};
};


回复
peter9606 2004-04-01
算了 重新开一贴吧
回复
发动态
发帖子
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
社区公告
暂无公告