socket 的一些麻烦

来源:互联网 发布:淘宝宝贝下如何下架 编辑:程序博客网 时间:2024/04/29 13:11

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

                    }

                }

            }



        }





    }

}


原创粉丝点击