在vs2010 上面倒是可以編譯的源代碼,但是換到2008上,編譯就出現瞭如下錯誤信息。
“sockaddr_in”: 未聲明的標識符
百度谷歌了半個小時多,真煩哪,沒找到錯在哪裏。
包含的頭文件是windows.h
最後還是有了結果,就是 在 sockaddr_in 的前頭 加上 struct.
還有錯誤
error C2275: “SOCKET”: 將此類型用作表達式非法
將其放到函數的前頭,即WSAStartup(MAKEWORD(2,2),&ws); 之前就可以了。
幾乎把所有變量聲明都放到了最前端,不過一般的情況下似乎不需要這個樣子的。中間聲明變量不可以麼?有人說可以,有人說不可以。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
int main(){
SYSTEMTIME sys;
WSADATA ws;
int ret =0;
SOCKET sListen;
SOCKET s;
SOCKET sClient;
fd_set allSocketSet;
fd_set readSet;
fd_set writeSet;
struct sockaddr_in clientAddr;
struct sockaddr_in servAddr;
char bufRecv[100];
char bufSend[100];
ret=WSAStartup(MAKEWORD(2,2),&ws);
if(ret!=0)
{
printf("WSATartup() failed!\n");
return -1;
}
sListen = socket(AF_INET,SOCK_STREAM,0);
if(sListen==INVALID_SOCKET)
{
return -1;
}
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = INADDR_ANY;
servAddr.sin_port = htons(8000);
ret = bind(sListen,(struct sockaddr*)&servAddr,sizeof(servAddr));
if(ret==SOCKET_ERROR)
return -1;
ret = listen(sListen,5);
if(ret == SOCKET_ERROR)
return -1;
FD_ZERO(&allSocketSet);
FD_ZERO(&readSet);
FD_ZERO(&writeSet);
readSet = allSocketSet;
writeSet = allSocketSet;
FD_SET(sListen,&allSocketSet);
while(1)
{
FD_ZERO(&readSet);
FD_ZERO(&writeSet);
readSet = allSocketSet;
writeSet = allSocketSet;
ret = select(0,&readSet,0,NULL,NULL);
if(ret == SOCKET_ERROR)
return -1;
if(ret >0)
{
unsigned int i;
for(i=0;i<allSocketSet.fd_count;++i)
{
s = allSocketSet.fd_array[i];
if(FD_ISSET(s,&readSet))
{
if(s==sListen)
{
int len =sizeof(clientAddr);
sClient =accept(s,(struct sockaddr*)&clientAddr,&len);
FD_SET(sClient,&allSocketSet);
GetLocalTime(&sys);
//memset(bufSend,0,100);
//memcpy(bufSend,&sys,sizeof(SYSTEMTIME));
//send(sClient,bufSend,sizeof(bufSend),0);
}
else{
ret = recv(s,bufRecv,100,0);
if(ret==SOCKET_ERROR)
{
DWORD err = WSAGetLastError();
if(err == WSAECONNRESET)
printf("client closed by force\n");
else
printf("recv() failed");
FD_CLR(s,&allSocketSet);
break;
}
FD_CLR(s,&allSocketSet);
printf("%s",bufRecv);
bufRecv[0]='\0';
// memset(bufSend,0,100);
// memcpy(bufSend,&sys,sizeof(SYSTEMTIME));
// send(s,bufSend,sizeof(bufSend),0);
}
}
}
}
}
}