一個簡單winsock 代碼

Network Programming for Microsoft Windows 2nd

winsock 從linux sock 發展過來, 目前是2.2 版本,  windows 網絡編程通常需要包含winsock2.h , 鏈接ws2_32.lib.

如下一個簡單服務器代碼

#include <winsock2.h>

#include <stdio.h>

#pragma comment (lib, "ws2_32.lib")

#define PORT 80

#define ADDR "127.0.0.1"


int main (int argc, char *argv[])

{

      WSADATA wsock ;

      SOCKET listensocket , newconnection;

      SOCKADDR_IN serveraddr , cliaddr;

      int cliaddrlen =sizeof( cliaddr);

      int nret =0;

      char buf [100];


      printf("init winsock.............................\n" );

      if(WSAStartup (MAKEWORD(2,2), & wsock) != 0)

     {

      printf("wsastart up failed\n" );

      exit(0);

     }


     printf("create socket...........................\n");

     listensocket= socket(AF_INET ,SOCK_STREAM, IPPROTO_TCP);

      if(listensocket ==INVALID_SOCKET)

     {

            printf("create socket failed\n" );

            WSACleanup();

            return 0;

     }

      printf("create sock success\n" );

      serveraddr.sin_family =AF_INET;

      serveraddr.sin_port =htons( PORT);

      serveraddr.sin_addr .s_addr= INADDR_ANY;

      if(bind (listensocket, ( SOCKADDR*)&serveraddr , sizeof(serveraddr ))==SOCKET_ERROR)

     {

            printf("bind failed\n" );

            closesocket(listensocket );

            WSACleanup();

            return 0;

     }

      if(listen (listensocket, 5)== SOCKET_ERROR)

     {

            printf("LISTEN failed\n" );

            closesocket(listensocket );

            WSACleanup();

            return 0;


     }

      printf("PLEASE WAIT\n" );

      newconnection=accept (listensocket,( SOCKADDR*)&cliaddr , &cliaddrlen);

      if(newconnection ==INVALID_SOCKET)

     {


            printf("connet failed\n" );

            closesocket(listensocket );

            WSACleanup();

            return 0;

     }

      printf("accept a connect\n" );

      closesocket(listensocket );

      memset(buf , 0, sizeof( buf));

      while(1)

     {

            nret = recv (newconnection, buf, sizeof (buf), 0);

            if(nret ==SOCKET_ERROR)

           {

                 printf("recv failed\n" );

                 closesocket(newconnection );

                 WSACleanup();

                 return 0;

           }

            printf("%s\n" , buf);

            if(strncmp (buf, "exit", strlen ("exit"))==0)

           {

                 break;

           }


     }

     

      closesocket(newconnection );

      WSACleanup();

      return 0;

      return 0;

}


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