備注學院

          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 閱讀(365) 評論(0)  編輯  收藏 所屬分類: C&C++
          主站蜘蛛池模板: 福清市| 景德镇市| 兴隆县| 孟州市| 永安市| 且末县| 绥中县| 祁阳县| 凌源市| 孝义市| 铁岭县| 聊城市| 韶关市| 沾化县| 辽阳市| 若羌县| 开阳县| 红河县| 张家港市| 深水埗区| 东兰县| 南安市| 化隆| 原阳县| 曲周县| 孝感市| 宣城市| 腾冲县| 化德县| 汉川市| 子洲县| 巨鹿县| 龙山县| 昭苏县| 乌审旗| 阿拉善左旗| 南和县| 金寨县| 鄂托克旗| 元朗区| 乐都县|