// socket_sever.cpp : 定義控制臺應用程式的入口點。
//
#include "stdafx.h"
//#include <Windows.h>
#include <WinSock2.h>
typedef struct _socket_list
{
SOCKET MainSock;
int num;
SOCKET sock_array[64];
}socket_list;
void init_list(socket_list *list)
{
int i;
list->MainSock = 0;
list->num = 0;
for(i = 0;i < 64;i ++){
list->sock_array[i] = 0;
}
}
void insert_list(SOCKET s,socket_list *list)
{
int i;
for(i = 0;i < 64; i++)
{
if(list->sock_array[i] == 0)
{
list->sock_array[i] = s;
list->num += 1;
break;
}
}
}
void delete_list(SOCKET s,socket_list *list)
{
int i;
for(i = 0;i < 64; i++)
{
if(list->sock_array[i] == s)
{
list->sock_array[i] = 0;
list->num -= 1;
break;
}
}
}
void make_fdlist(socket_list *list,fd_set *fd_list)
{
int i;
FD_SET(list->MainSock,fd_list);
for(i = 0;i < 64;i++)
{
if(list->sock_array[i] > 0)
{
FD_SET(list->sock_array[i],fd_list);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsadata;
int err;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsadata);
if (err!=0)
{
printf("socket加載字庫失敗\n");
return false;
}
SOCKET SeverSocket=socket(AF_INET,SOCK_STREAM,0);
//u_long u=1;
//ioctlsocket(SeverSocket,FIONBIO, &u);
SOCKADDR_IN socksin;
socksin.sin_family=AF_INET;
socksin.sin_port=htons(6688);
socksin.sin_addr.s_addr=htonl(INADDR_ANY);
// socksin.sin_addr.s_addr=inet_addr("192.168.22.5"); 系結固定IP
bind(SeverSocket,(sockaddr*)&socksin,sizeof(socksin));
listen(SeverSocket,5);//監聽
//清理
//fd_set fdSocket;
//FD_ZERO(&fdSocket);
//FD_SET(SeverSocket,&fdSocket);
socket_list sock_list;
init_list(&sock_list);
sock_list.MainSock=SeverSocket;
SOCKET sNew;
timeval time={5,0};
SOCKADDR_IN addrRemote;
int len=sizeof(addrRemote);
while(1)
{
fd_set fdRead;
FD_ZERO(&fdRead);
make_fdlist(&sock_list,&fdRead);
int nRet=select(0,&fdRead,NULL,NULL,&time);
if (nRet==SOCKET_ERROR)
{
printf("select error! errcode=%d \n",WSAGetLastError());
break;
}
if (nRet==0)
{
printf("timeout\n");
continue;
}
if (FD_ISSET(sock_list.MainSock,&fdRead))
{
sNew=accept(SeverSocket,(sockaddr*)&addrRemote,&len);//接受鏈接
insert_list(sNew,&sock_list);
printf("有客戶端鏈接 %s\n",inet_ntoa(addrRemote.sin_addr));
}
for (int i=0;i<64;i++)
{
if(sock_list.sock_array[i] == 0) continue;
if (FD_ISSET(sock_list.sock_array[i],&fdRead))
{
char szText[256];//不能初始化為0,為0,下面接受不了資料
int nRecv=recv(sock_list.sock_array[i],szText,strlen(szText),0);
if (nRecv==0)
{
//連接.關閉重啟.中斷.
closesocket(sock_list.sock_array[i]);
delete_list(sock_list.sock_array[i],&sock_list);
//fdSocket.fd_array[i]=0;
printf("斷開鏈接\n");
continue;
}
else if (nRecv==SOCKET_ERROR)
{
if(WSAGetLastError() == WSAEWOULDBLOCK)
closesocket(sock_list.sock_array[i]);
printf("recv err\n");
delete_list(sock_list.sock_array[i],&sock_list); //連接斷開后,從佇列中移除該套接字
continue;
}
szText[nRecv]='\0';
printf("接收到的資料%s \n",szText);
}
}
}
closesocket(SeverSocket);
WSACleanup();
getchar();
return 0;
}
select模型的.
char szText[256];//不能初始化為0,為0,下面接受不了資料
int nRecv=recv(sock_list.sock_array[i],szText,strlen(szText),0);
szText[256]={0};這樣賦值下面的nRecv就一直是0,szText也="";
換成上面的代碼又可以接受資料.為什么?????
客戶端發送幾次資料,服務端接受幾次后,(服務端這邊)接受的資料就是不全的,在接受幾次,一點資料都收不到了????????????
uj5u.com熱心網友回復:
int nRecv=recv(sock_list.sock_array[i],szText,strlen(szText),0);郁悶了,strlen(szText),這個蛋疼嗯
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128996.html
標籤:網絡通信
上一篇:關于android程式掃描周圍WiFi信號并且上傳到資料庫
下一篇:base64決議亂碼問題!
