使用TCP+winsock写的一个简单服务器程序(转)

来源:互联网 发布:电视网络机顶盒怎么用 编辑:程序博客网 时间:2024/06/04 08:39

本代码用VS2008编写:

 

[cpp:firstline[1]] view plaincopyprint?
  1. //先打开服务器端,服务器在执行完recv()后堵塞,等待接收数据...  
  2. #include <winsock2.h>  
  3. #include <stdio.h>  
  4. #pragma comment(lib,"WS2_32.LIB")  
  5. void main()  
  6. {  
  7.     WSADATA          wsaData;  
  8.     SOCKET           ListeningSocket;  
  9.     SOCKET           NewConnection;  
  10.     SOCKADDR_IN      ServerAddr;  
  11.     SOCKADDR_IN      ClientAddr;  
  12.     char RecviverBuf[1024];  
  13.     int BufLength = 1024;  
  14.     int Port = 8060;  
  15.     int Ret;  
  16.     //初始化Winsock版本2.2  
  17.     if((Ret =WSAStartup(MAKEWORD(2,2),&wsaData)) != 0)  
  18.     {  
  19.         printf("ERROR:WSAStartup failed with %d/n",Ret);  
  20.         return;  
  21.     }  
  22.     //创建一个新的套接字来监听客户机链接  
  23.     if(INVALID_SOCKET == (ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))  
  24.     {  
  25.         printf("ERROR:SOCKET failed with %d/n",WSAGetLastError());  
  26.         WSACleanup();  
  27.         return;  
  28.     }  
  29.     //建立一个SOCKADDR_IN结构,这个结构告知bind我们想得到的8060端口监听所有接口上的连接  
  30.     ServerAddr.sin_family = AF_INET;  
  31.     ServerAddr.sin_port = htons(Port);  
  32.     ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  33.     //使用bind将这个地址信息和套接字关联起来  
  34.     if(SOCKET_ERROR == bind(ListeningSocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr)))  
  35.     {  
  36.         printf("ERROR:bind failed with %d/n",WSAGetLastError());  
  37.         closesocket(ListeningSocket);  
  38.         WSACleanup();  
  39.         return;  
  40.     }  
  41.    
  42.     //监听客户机连接。这里使用5个backlog,许多应用程序一般都使用这个数量  
  43.     if(SOCKET_ERROR == listen(ListeningSocket,5))  
  44.     {  
  45.         printf("ERROR:listen failed with %d/n",WSAGetLastError());  
  46.         closesocket(ListeningSocket);  
  47.         WSACleanup();  
  48.         return;  
  49.     }  
  50.     //连接到达时,接受一个新的连接  
  51.     int ClientAddrLen = sizeof(ClientAddr);  
  52.     if(INVALID_SOCKET == (NewConnection = accept(ListeningSocket,(SOCKADDR *)&ClientAddr,&ClientAddrLen)))  
  53.     {  
  54.         printf("ERROR:accept failed with %d/n",WSAGetLastError());  
  55.         closesocket(ListeningSocket);  
  56.         WSACleanup();  
  57.         return;  
  58.     }  
  59.     printf("accept succeed!/n");  
  60.     //接受数据    
  61.     //注意recv()/send()和recvfrom()/sendto()的区别:使用recv()/send()需要先建立连接,而recvfrom()/sendto()不需要先建立连接...  
  62.     if(SOCKET_ERROR == recv(NewConnection,RecviverBuf,BufLength,0))  
  63.     {  
  64.         printf("ERROR:recv failed with %d/n",WSAGetLastError());  
  65.         closesocket(ListeningSocket);  
  66.         WSACleanup();  
  67.         return;  
  68.     }  
  69.     printf("recv succeed!/n");  
  70.     //显示接收到的数据  
  71.     for(int id=0; id<5 ;++id)  
  72.         printf("%c",RecviverBuf[id]);  
  73.     //完成接受新连接后,应该用closesocket API关闭这些套接字  
  74.     closesocket(NewConnection);  
  75.     closesocket(ListeningSocket);  
  76.     //应用程序完成对连接的处理后,调用WSACleanup  
  77.     WSACleanup();  


原创粉丝点击