socket 的一些麻煩

在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);

                    }

                }

            }



        }





    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章