備注學院

          LuLu

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            5 隨筆 :: 50 文章 :: 16 評論 :: 0 Trackbacks
          本來不想寫這篇文章的,發現網上真很難找到windows下socket的編程的示例代碼。而自己又不能一下仔背過這么多的規范,雖然代碼不少也貼上來吧,代碼解析就先免一點了,有代碼而在網上找解析還是挺簡單的,以后也好找點~~
            可能其他方式也能實現,我會一種也差不多了,呵呵。
           
          有點需要特別注意的,因為我用的是MinGW為C編譯器,所以編譯的時候需要加上-lwsock32的參數。
          如: gcc server.c -o server -lwsock32
           
          服務器端代碼:
          #include<stdio.h>
          #include<winsock.h> 
          #pragma comment (lib, "ws2_32.lib")
          BOOL InitWinsock();
          void main(){
           SOCKET socket1;
           InitWinsock();
           struct sockaddr_in local;
           
           local.sin_family=AF_INET;
           local.sin_port=htons(3490); ///監聽端口
           local.sin_addr.s_addr=INADDR_ANY; ///本機
           memset(local.sin_zero,0,8);
           
           socket1=socket(AF_INET,SOCK_STREAM,0);
           int bind_result = bind(socket1,(struct sockaddr*)&local,sizeof(local));
           while (1){
            int nlisten = listen(socket1, 10);
              printf("Listening......\n");
              struct sockaddr_in their_addr;
              int nSize = sizeof(their_addr);
              int nNewFd = accept(socket1, (struct sockaddr*)&their_addr, &nSize);
            printf("Accepted! IP:%s: Port:%d\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port));
            Sleep(500);
           }
           closesocket(socket1);
          }

          BOOL InitWinsock(){
           int Error;
           WORD VersionRequested;
           WSADATA WsaData;
           VersionRequested=MAKEWORD(2,2);
           Error=WSAStartup(VersionRequested,&WsaData); //啟動WinSock2
           if(Error!=0){
            return FALSE;
           }
           else {
            if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2){
             WSACleanup();
             return FALSE;
            }
           }
           return TRUE;
          }
           
          客戶段代碼:
          #include<stdio.h>
          #include<winsock.h> 
          #pragma comment (lib, "ws2_32.lib")
          BOOL InitWinsock();
          void main(){
           SOCKET socket1;
           InitWinsock();
           struct sockaddr_in from;
           struct sockaddr_in local;
           local.sin_family = AF_INET;
           local.sin_port = htons(888);
           local.sin_addr.s_addr = INADDR_ANY;
           int fromlen =sizeof (from);
           socket1 = socket(AF_INET,SOCK_STREAM,0);
           int nbind = bind(socket1,(struct sockaddr*)&local, sizeof(local));
           if (nbind < 0){
            printf("error");
            exit(1);
           }
           from.sin_family = AF_INET;
           from.sin_port = htons(3490);
           from.sin_addr.S_un.S_addr = inet_addr("10.10.110.249");
           memset(from.sin_zero, 0, 8);
           int nCon = connect(socket1, (struct sockaddr*)& from, sizeof (from));
           if (nCon < 0){
            printf("error");
            exit(1);
           }
          }
          BOOL InitWinsock(){
           int Error;
           WORD VersionRequested;
           WSADATA WsaData;
           VersionRequested = MAKEWORD(2,2);
           Error = WSAStartup(VersionRequested, &WsaData);
           if (Error != 0){
            return FALSE;
           }
           else {
            if(LOBYTE(WsaData.wVersion) != 2 || HIBYTE(WsaData.wHighVersion) != 2){
             WSACleanup();
             return FALSE;
            }
           }
           return TRUE;
          }
          posted on 2007-11-17 10:13 smildlzj 閱讀(371) 評論(0)  編輯  收藏 所屬分類: C&C++
          主站蜘蛛池模板: 大港区| 镇巴县| 东乡| 通化县| 马关县| 塘沽区| 宁远县| 柞水县| 栾川县| 增城市| 昭苏县| 鄂托克前旗| 湟源县| 扎赉特旗| 黎川县| 乌海市| 珲春市| 南城县| 宁海县| 加查县| 来宾市| 玉林市| 阳谷县| 开原市| 绥中县| 和顺县| 噶尔县| 崇义县| 湘乡市| 澎湖县| 威远县| 桦川县| 珠海市| 凤翔县| 土默特右旗| 龙陵县| 花莲市| 句容市| 平乐县| 红原县| 九龙城区|