zoukankan      html  css  js  c++  java
  • socket编程:select 用法 例子

    服务器:

    #include <stdio.h>   
    #include <string.h>   
    #include <WINSOCK2.H>   
      
    #pragma comment(lib,"ws2_32.lib")   
      
    #define INT_SERVER_PORT 6002   
    #define STR_SERVER_IP "127.0.0.1"   
    #define INT_DATABUFFER_SIZE 100   
      
    void main(void)  
    {  
        WORD dwVersion = MAKEWORD(2,2);  
        WSAData wsaData;  
        WSAStartup(WINSOCK_VERSION,&wsaData);  
      
        SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0);  
        if (INVALID_SOCKET == sockServer)  
        {  
            printf("Failed to create socket!/r/n");  
            WSACleanup();  
            return;  
        }  
      
        sockaddr_in addrServer;  
        memset(&addrServer,0,sizeof(sockaddr_in));  
        addrServer.sin_family = AF_INET;  
        addrServer.sin_port = htons(INT_SERVER_PORT);  
        addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
        //addrServer.sin_addr.s_addr = htonl(INADDR_ANY);   
      
        int iResult;  
      
        bool bReuseAddr=true;  
        iResult=setsockopt(sockServer,SOL_SOCKET,SO_REUSEADDR,(char *)&bReuseAddr,sizeof(bReuseAddr));  
        if(SOCKET_ERROR == iResult)  
        {  
            printf("Failed to set resueaddr socket!/r/n");  
            WSACleanup();  
            return;  
        }  
          
        /* 
        unsigned   long cmd = 1;  
        iResult= ioctlsocket(sockServer,FIONBIO,&cmd); */  
      
        iResult = bind(sockServer,(sockaddr *)&addrServer,sizeof(addrServer));  
        if (SOCKET_ERROR == iResult)  
        {  
            printf("Failed to bind address!/r/n");  
            WSACleanup();  
            return;  
        }  
      
        if (0 != listen(sockServer,5))  
        {  
            printf("Failed to listen client!/r/n");  
            WSACleanup();  
            return;  
        }  
      
        UINT i = 0;  
        SOCKET sockAccept;  
        sockaddr_in addrAccept;  
        int iAcceptLen = sizeof(addrAccept);  
        char szDataBuff[INT_DATABUFFER_SIZE];  
        int iRecvSize;  
          
        sockaddr_in addrTemp;  
        int iTempLen;  
      
        fd_set fd;  
        FD_ZERO(&fd);  
        FD_SET(sockServer,&fd);  
      
        /* 
        timeval tm; 
        tm.tv_sec = 0; 
        tm.tv_usec = 1000; 
        */  
        printf("Start server.../r/n");  
        while(1)  
        {  
            fd_set fdOld = fd;  
            iResult = select(0,&fdOld,NULL,NULL,/*&tm*/NULL);  
            if (0 <= iResult)  
            {  
                for(i = 0;i < fd.fd_count; i++)  
                {  
                    if (FD_ISSET(fd.fd_array[i],&fdOld))  
                    {  
                        //如果socket是服务器,则接收连接   
                        if (fd.fd_array[i] == sockServer)  
                        {  
                            memset(&addrAccept,0,sizeof(addrTemp));  
                            sockAccept = accept(sockServer,(sockaddr *)&addrAccept,&iAcceptLen);  
                            if (INVALID_SOCKET != sockAccept)  
                            {  
                                FD_SET(sockAccept,&fd);  
                                //FD_SET(sockAccept,&fdOld);   
                                printf("%s:%d has connected server!/r/n",inet_ntoa(addrAccept.sin_addr),  
                                    ntohs(addrAccept.sin_port));  
                            }  
                        }  
                        else //非服务器,接收数据(因为fd是读数据集)   
                        {  
                            memset(szDataBuff,0,INT_DATABUFFER_SIZE);  
                            iRecvSize = recv(fd.fd_array[i],szDataBuff,INT_DATABUFFER_SIZE,0);  
                            memset(&addrTemp,0,sizeof(addrTemp));  
                            iTempLen = sizeof(addrTemp);  
                            getpeername(fd.fd_array[i],(sockaddr *)&addrTemp,&iTempLen);  
                              
                            if (SOCKET_ERROR == iRecvSize)  
                            {  
                                closesocket(fd.fd_array[i]);  
                                FD_CLR(fd.fd_array[i],&fd);  
                                i--;  
                                printf("Failed to recv data ,%s:%d errorcode:%d./r/n",  
                                    inet_ntoa(addrTemp.sin_addr),ntohs(addrTemp.sin_port),WSAGetLastError());  
                                continue;  
                            }  
      
                            if (0 == iRecvSize)  
                            {  
                                //客户socket关闭   
                                printf("%s:%d has closed!/r/n",inet_ntoa(addrTemp.sin_addr),  
                                    ntohs(addrTemp.sin_port));  
                                  
                                closesocket(fd.fd_array[i]);  
                                FD_CLR(fd.fd_array[i],&fd);  
                                i--;      
                            }  
                              
                            if (0 < iRecvSize)  
                            {  
                                //打印接收的数据   
                                printf("recv %s:%d data:%s/r/n",inet_ntoa(addrTemp.sin_addr),  
                                    ntohs(addrTemp.sin_port),szDataBuff);  
                            }  
                        }     
                    }  
                }  
            }  
            else if (SOCKET_ERROR == iResult)  
            {  
                //WSACleanup();    
            //  printf("Faild to select sockt in server!/r/n");   
                Sleep(100);  
            }  
        }  
        WSACleanup();  
    }  
    

    客户端:

    #include <stdio.h>   
    #include <string.h>   
    #include <WINSOCK2.H>   
      
    #pragma comment(lib,"ws2_32.lib")   
      
    #define INT_SERVER_PORT 6002   
    #define STR_SERVER_IP "127.0.0.1"   
    #define INT_DATABUFFER_SIZE 100   
    #define STR_EXIT "exit"   
      
    void main(void)  
    {  
        WSAData wsaData;  
        WSAStartup(WINSOCK_VERSION,&wsaData);  
      
        SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);  
        if (INVALID_SOCKET == sockClient)  
        {  
            printf("Failed to create client!/r/n");  
            WSACleanup();  
        }  
      
        sockaddr_in addrClient;  
        addrClient.sin_addr.S_un.S_addr = inet_addr(STR_SERVER_IP);  
        addrClient.sin_family = AF_INET;  
        addrClient.sin_port = htons(INT_SERVER_PORT);  
      
          
        int iResult;  
        iResult = connect(sockClient,(sockaddr *)&addrClient,sizeof(sockaddr_in));  
        if (SOCKET_ERROR == iResult)  
        {  
            printf("Failed to connect server!/r/n");  
            WSACleanup();  
            return;   
        }   
      
        if (0 != iResult)  
        {  
            int iErrorCode;  
            iErrorCode = WSAGetLastError();  
            printf("Failed to connect server,error:%d./r/n",iErrorCode);  
            WSACleanup();  
            return;  
        }  
        char szDataBuffer[INT_DATABUFFER_SIZE];  
        while(1)  
        {  
            memset(szDataBuffer,0,INT_DATABUFFER_SIZE);  
            scanf("%s",szDataBuffer);  
      
            if (0 == strcmp(szDataBuffer,STR_EXIT))  
            {  
                printf("The client has stopped!/r/n");  
                break;  
            }  
            else  
            {  
                if (1 > send(sockClient,szDataBuffer,strlen(szDataBuffer),0))  
                {  
                    printf("Failed to send data!/r/n");  
                }  
            }  
            Sleep(100);  
        }  
        closesocket(sockClient);  
        WSACleanup();  
      
    }  
    


     

  • 相关阅读:
    VC计时器的一个使用心得
    从送新年礼物给外甥想到的
    对公司用人的一些思考
    [Python学习]PycURL简单学习 limodou的学习记录 limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …
    Django tips: the difference between 'blank' and 'null'
    django 单独使用数据模型
    Django application as a standalone desktop application at finally{}
    和煦: curl_setopt($ch, CURLOPT_RETURNTRANSFER,1) 使用
    [sqllite]c语言操作sqlite一: 连接sqlite数据库
    使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693503.html
Copyright © 2011-2022 走看看