winsock2之服务器程序的简单实现

1.在使用socket函数前需要定义一个结构体:

  WSADATA wsaData;

2.对wsaData进行填充:

  int wsaret=WSAStartup(0x101,&wsaData);  // 第一个参数指定了程序允许使用的WinSock规范的最高版本

  if (wsaret != 0)  // 返回值为0则成功,否则失败 

    return;

3.声明套接字地址:

  sockaddr_in local;  // TCP/IP套接字地址

4.填充local结构体:

  local.sin_family=AF_INET;         // 地址族
  local.sin_addr.s_addr=INADDR_ANY;   // 网际IP地址
  local.sin_port=htons((u_short)20248);  // 使用的端口

5.创建Socket:

  SOCKET  server=socket(AF_INET,SOCK_STREAM,0);

  if(server==INVALID_SOCKET)  // 如果创建失败,则返回(~0)
    return;

6.绑带套接字和地址:

  if ( bind(server,(sockaddr*)&local,sizeof(local))!=0 )  // 填值的时候使用sockaddr_in结构,而作为函数的参数传入的     return;                        // 时候转换成sockaddr结构

7.监听来自客户端的连接:

  if( listen(server,10)!=0 )    // 第二个参数为最大连接数,返回0则成功

    return;
8.声明客户端变量:

  SOCKET client;
  sockaddr_in from;
  int fromlen=sizeof(from);

9.保存客户端的套接字:

  while(true) // 无限循环
    {
        char temp[512];

        client=accept (server, (struct sockaddr*)&from, &fromlen);  // 接收即将到来的客户端连接

        sprintf(temp,"Your IP is %s\r\n",inet_ntoa(from.sin_addr));

        send(client,temp,strlen(temp),0);    // 简单地向客户端发送这个字符串
        closesocket(client);    // 关闭客户端套接字

    }

10.关闭服务器端套接字,并释放套接字描述符:

   closesocket(server);

11.清除socket:

  WSACleanUp();

  应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的WSAStartup()调用.当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源.任何打开的并已建立连接的SOCK_STREAM类型套接口在调用WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响--该数据仍要发送.


测试函数:

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    printf("Press ESCAPE to terminate program.\n");
    AfxBeginThread(ServerThread,0);
    while(_getch()!=27);

    return nRetCode;
}

// ServerThread函数就是上面的步骤的整合

 

posted @ 2010-11-17 10:29    阅读(452)  评论(0)    收藏  举报