Windows socket 编程汇总

一常用数据结构

1 SOCKET

typedef u_int           SOCKET

其实就是一个无符号的整数,是一个socket描述符,我的理解就是 ,指向系统内核的”指针”,但这个”指针”要靠系统维护,我们只能获取,还要负责释放.

 

2 SOCKADDR_IN

struct sockaddr_in{

     short sin_family;

     unsigned short sin_port;

     IN_ADDR sin_addr;

     char sin_zero[8];

};

用来指定本地或远程的地址,以此来进行socket连接

sin_family:指定为AF_INET

sin_port: 指定所连接的端口号,用htons将short的端口号进行转换,如htons(6000)

sin_addr:指定所连接的ip,用inet_addr装换,如inet_addr(“127.0.0.1”)

sin_zero:为了和SOCKADDR的大小相同,而进行的填充,应该将其初始化为0

 

 

二 常用函数

1 WSAStartup

原型:

 int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData)

作用:

      用来初始化ws2_32.lib

返回值:

    成功返回0

 

2 WSACleanup

终止ws2_32.lib

 

3 socket

原型:

SOCKET socket (int af, int type, int protocol );

参数说明

af:指定地址家族,AF_INET

type: SOCK_STREAMSOCK_DGRAM,前者用于TCP,后者用于UDP

protocol:设置为0即可

作用:

创建一个SOCKET

返回值

创建失败返回INVALID_SOCKET

 

4 bind

原型:

int bind( SOCKET s, const struct sockaddr FAR *name,int namelen );

参数说明

s:server端已经创建好的SOCKET

name:server的SOCKADDR_IN结构,需要做强制类型转换,注意,他和SOCKADDR的大小一样

namelen:顾名思义,name的size大小,注意他和SOCKADDR的大小一样

作用

SOCKET绑定到机器上

返回值

成功返回0,错误返回SOCKET_ERROR

 

5 listen

原型

int listen(  SOCKET s,      int backlog  );

参数说明

s: 服务端未连接的SOCKET

backlog:最大可连接数

作用

设置tcp服务端

返回值

成功返回0,失败返回SOCKET_ERROR

 

6 accept

原型

SOCKET accept(  SOCKET s,  struct sockaddr FAR *addr,  int FAR *addrlen);

参数说明

s:tcp服务端的SOCKET

addr:远程客户端的地址信息

addlen:addrsize

作用

从已经获得许可的连接中关联一个新的SOCKET

返回值

成功返回新的SOCKET的值,错误返回INVALID_SOCKET

 

7 send

原型

int send(SOCKET s, const char FAR *buf,  int len, int flags );

参数说明

s:对方的SOCKET

buf:要发送的缓冲区的地址

flags:通常置为0

作用

向对方发送数据

返回值

成功返回已发送的数据的字节数,错误返回SOCKET_ERROR

 

8 recv

原型

int recv(  SOCKET s, char FAR *buf, int len, int flags       );

参数说明

s:对方的SOCKET

buf:要发送的缓冲区的地址

flags:通常置为0

作用

接受对方的数据

返回值

成功返回已接受的数据的字节数,错误返回SOCKET_ERROR

 

9 closesocket

原型

int closesocket(  SOCKET s  );

参数说明

s:要关闭的SOCKET

作用

关闭指定的SOCKET

返回值

成功返回0,错误返回SOCKET_ERROR

 

10 connect

原型

Int connect(SOCKET s,const struct sockaddr FAR *name,int namelen)                        );

参数说明

S:本地SOCKET

name:远程服务端地址信息

namelen:namesize

作用

远程socket连接

返回值

成功返回0,错误返回SOCKET_ERROR

 

11 sendto

原型

int sendto(  SOCKET s, const char FAR *buf,  int len, int flags, const struct sockaddr FAR *to,    int tolen);                        );

参数说明

S:对方的SOCKET,可能是连接状态

buf:要发送的信息地址

len:信息的大小

flags:通常置为0

to:远程地址信息

tolen:tosize

作用

用于UDP,数据的发送

返回值

成功返回已发送的数据的字节数,错误返回SOCKET_ERROR

 

12 recvfrom

原型

int recvfrom(  SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen );

参数说明

S:对方的SOCKET,可能是连接状态

buf:用于接收的缓冲区地址

len:信息的大小

flags:通常置为0

from:接收远程地址信息

fromlen:tosize

作用

用于UDP,数据的接收

返回值

成功返回已接收的数据的字节数,错误返回SOCKET_ERROR

 

15 WSAGetLastError

原型: int  WSAGetLastError (void);

作用:返回最后一次的错误代码

错误代码在WINSOCK2.H中定义

 

14 一些转换函数

ntohs:”network to host short”

ntohl:”network to host long”

htons:”host to network short”

htonl:”host to network long”

inet_addr:将字符串的IP转换为网络IP

 

三正式编程

以下程序在vc6.0下编译

1 tcp编程

TCP  Server:

[cpp] view plain copy
  1. /************************************************************************/  
  2. /* 
  3. 准备步骤 
  4. #include <WINSOCK2.H> 
  5. #pragma     comment(lib, "ws2_32.lib ") 
  6.  
  7. 服务器端编程的步骤: 
  8. 0:加载套接字库(WSAStartup()) 
  9.  
  10. 1:创建套接字(socket()); 
  11.    
  12. 2:绑定套接字到一个IP地址和一个端口上(bind()); 
  13.      
  14. 3:将套接字设置为监听模式等待连接请求(listen()); 
  15.        
  16. 4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept()); 
  17.          
  18. 5:用返回的套接字和客户端进行通信(send()/recv()); 
  19.            
  20. 6:返回,等待另一连接请求; 
  21.              
  22. 7:关闭套接字(closesocket()) 
  23.  
  24. 8:关闭加载的套接字库(WSACleanup())。 
  25.  
  26.                                                                         */  
  27. /************************************************************************/  
  28. #include <WINSOCK2.H>  
  29. #include <windows.h>  
  30. #include <iostream>  
  31. #include <string>  
  32. using namespace std;  
  33. #pragma     comment(lib, "ws2_32.lib ")  
  34.   
  35.   
  36. //0   
  37. bool LoadWSA();  
  38. //1  
  39. bool CreateSocket(SOCKET& sock,int type=SOCK_STREAM);  
  40. //2  
  41. bool BindSocket(SOCKET& sock,short port ,const char* strIp);  
  42. //3  
  43. bool SetListen(SOCKET& sock,int number);  
  44. //4,5,6  
  45. bool Communicate(SOCKET& srverSock);  
  46. //7  
  47. bool CloseSocket(SOCKET& sock);  
  48. //8  
  49. void CloseWSA();  
  50.   
  51. void ExitWithErrorMessage(const string& errMsg);  
  52.   
  53. DWORD WINAPI ClientThread(LPVOID sockCliet);  
  54.    
  55. void main()  
  56. {  
  57.     cout<<"start server.\n";  
  58.   
  59.     if(!LoadWSA() )  
  60.         ExitWithErrorMessage("LoadWSA  failed.");  
  61.     cout<<"LoadWAS success.\n";  
  62.   
  63.     SOCKET serSock;  
  64.   
  65.     if(!CreateSocket(serSock) )  
  66.         ExitWithErrorMessage("create server socket failed.");  
  67.     cout<<"CreateSocket success.\n";  
  68.   
  69.     if(!BindSocket(serSock,6000,"127.0.0.1") )  
  70.         ExitWithErrorMessage("BindSocket failed.");  
  71.     cout<<"BindSocket success.\n";  
  72.   
  73.     if(!SetListen(serSock,10) )  
  74.         ExitWithErrorMessage("SetListen failed.");  
  75.     cout<<"SetListen success.\n";  
  76.       
  77.     if(!Communicate(serSock) )  
  78.         ExitWithErrorMessage("Communicate failed.");  
  79.     cout<<"Communicate success.\n";  
  80.   
  81.     if(! CloseSocket(serSock) )  
  82.         ExitWithErrorMessage("CloseSocket failed.");  
  83.     cout<<"CloseSocket success.\n";  
  84.   
  85.     CloseWSA();  
  86.     cout<<"CloseWSA success.\n";  
  87. }  
  88.   
  89.   
  90. bool LoadWSA()  
  91. {  
  92.     WSAData wsaData;  
  93.   
  94.     if( 0 == WSAStartup(MAKEWORD(2,2),&wsaData) )  
  95.     {  
  96.         return true;  
  97.     }  
  98.   
  99.     return false;  
  100. }  
  101.   
  102. void CloseWSA()  
  103. {  
  104.     WSACleanup();  
  105. }  
  106.   
  107. bool CreateSocket(SOCKET& sock,int type/* =SOCK_STREAM */)  
  108. {  
  109.     sock=socket(AF_INET,type,0);  
  110.   
  111.     if(INVALID_SOCKET == sock)  
  112.     {  
  113.         return false;  
  114.     }  
  115.   
  116.     return true;  
  117. }  
  118.   
  119. bool BindSocket(SOCKET& sock,short port ,const char* strIp)  
  120. {  
  121.     SOCKADDR_IN address;  
  122.       
  123.     address.sin_family=AF_INET;       
  124.     address.sin_addr.s_addr =inet_addr(strIp);  
  125.     address.sin_port=htons(port);  
  126.     memset(address.sin_zero,0,sizeof(address.sin_zero));  
  127.   
  128.     if(SOCKET_ERROR == bind(sock,(const struct sockaddr*)&address,sizeof(struct sockaddr)) )  
  129.     {  
  130.         return false;  
  131.     }  
  132.   
  133.     return true;  
  134. }  
  135.   
  136. bool SetListen(SOCKET& sock,int number)  
  137. {  
  138.     if(SOCKET_ERROR == listen(sock,number) )  
  139.     {  
  140.         return false;  
  141.     }  
  142.   
  143.     return true;  
  144. }  
  145.   
  146. bool Communicate(SOCKET& srverSock)  
  147. {  
  148.     SOCKADDR_IN addrClient;  
  149.     SOCKET      newSock;  
  150.     HANDLE  hThread=NULL;  
  151.     int n=sizeof(struct sockaddr);  
  152.     bool flag=true;  
  153.       
  154.     while(true)  
  155.     {  
  156.         newSock=accept(srverSock,( struct sockaddr*)&addrClient,&n);      
  157.           
  158.         if(newSock == INVALID_SOCKET)  
  159.         {  
  160.             cout<<"accept failed.\n";  
  161.             flag=false;  
  162.             break;  
  163.         }  
  164.       
  165.         cout<<"client from "<<inet_ntoa(addrClient.sin_addr)<<":"<<ntohs(addrClient.sin_port)<<endl;  
  166.   
  167.         hThread=CreateThread(NULL,0,ClientThread,(LPVOID)newSock,0,NULL);  
  168.   
  169.         if(hThread==NULL)  
  170.         {  
  171.             cout<<"CreateThread failed.\n";  
  172.             flag=false;  
  173.             break;  
  174.         }  
  175.   
  176.         CloseHandle(hThread);  
  177.     }  
  178.   
  179.     closesocket(newSock);  
  180.   
  181.     return flag;  
  182. }  
  183.   
  184.   
  185. bool CloseSocket(SOCKET& sock)  
  186. {  
  187.     if( closesocket(sock) == SOCKET_ERROR)   
  188.         return false;  
  189.     return true;  
  190. }  
  191.   
  192. void ExitWithErrorMessage(const string& errMsg)  
  193. {  
  194.     cout<<errMsg<<endl;  
  195.     system("pause");  
  196.     exit(1);  
  197. }  
  198.   
  199. DWORD WINAPI ClientThread(LPVOID sockCliet)  
  200. {  
  201.     SOCKET sock=(SOCKET)sockCliet;  
  202.     char buffer[100]={0};  
  203.     int errCode;  
  204.   
  205.     while(true)  
  206.     {  
  207.         memset(buffer,0,100);  
  208.         errCode=recv(sock,buffer,100,0);  
  209.   
  210.         if(errCode==0 || errCode==SOCKET_ERROR)  
  211.         {  
  212.             cout<<"client exit.\n";  
  213.             break;  
  214.         }  
  215.           
  216.         cout<<"message from client: "<<buffer<<endl;  
  217.           
  218.         send(sock,"welcome.",strlen("welcome."),0);  
  219.     }  
  220.   
  221.     return 0;  
  222. }  


TCP Client

[cpp] view plain copy
  1. /************************************************************************/  
  2. /*  
  3. 准备步骤 
  4. #include <WINSOCK2.H> 
  5. #pragma     comment(lib, "ws2_32.lib ") 
  6.  
  7. 0:加载套接字库(WSAStartup()) 
  8.  
  9. 1:创建套接字(socket()); 
  10.    
  11. 2:向服务器发出连接请求(connect()); 
  12.      
  13. 3:和服务器端进行通信(send()/recv()); 
  14.        
  15. 4:关闭套接字(closesocket()) 
  16.  
  17. 5: 关闭加载的套接字库(WSACleanup())。 
  18.  
  19.                                                                      */  
  20. /************************************************************************/  
  21.   
  22. #include <WINSOCK2.H>  
  23. #include <windows.h>  
  24. #include <iostream>  
  25. #include <string>  
  26. using namespace std;  
  27. #pragma     comment(lib, "ws2_32.lib ")  
  28.   
  29.   
  30. //0   
  31. bool LoadWSA();  
  32. //1  
  33. bool CreateSocket(SOCKET& sock,int type=SOCK_STREAM);  
  34. //2  
  35. bool ConnectToServer(SOCKET& sock,short port ,const char* strIp);  
  36. //3  
  37. bool Communicate(SOCKET& sock);  
  38. //4  
  39. bool CloseSocket(SOCKET& sock);  
  40. //5  
  41. void CloseWSA();  
  42.   
  43. void ExitWithErrorMessage(const string& errMsg);  
  44.   
  45.   
  46. void main()  
  47. {  
  48.     cout<<"Start Client.\n";  
  49.     if(!LoadWSA() )  
  50.         ExitWithErrorMessage("LoadWSA  failed.");  
  51.     cout<<"LoadWSA Success.\n";  
  52.       
  53.     SOCKET clietSock;  
  54.       
  55.     if(!CreateSocket(clietSock) )  
  56.         ExitWithErrorMessage("create server socket failed.");  
  57.     cout<<"CreateSocket Success.\n";  
  58.   
  59.     if(!ConnectToServer(clietSock,6000,"127.0.0.1") )  
  60.         ExitWithErrorMessage("ConnectToServer failed.");  
  61.     cout<<"ConnectToServer Success.\n";  
  62.   
  63.     if(!Communicate(clietSock) )  
  64.         ExitWithErrorMessage("Communicate failed.");  
  65.     cout<<"Communicate Success.\n";  
  66.   
  67.     if(! CloseSocket(clietSock) )  
  68.         ExitWithErrorMessage("CloseSocket failed.");  
  69.     cout<<"CloseSocket Success.\n";  
  70.   
  71.     CloseWSA();  
  72.     cout<<"CloseWSA Success.\n";  
  73.   
  74.   
  75. }  
  76.   
  77. bool LoadWSA()  
  78. {  
  79.     WSAData wsaData;  
  80.       
  81.     if( 0 == WSAStartup(MAKEWORD(2,2),&wsaData) )  
  82.     {  
  83.         return true;  
  84.     }  
  85.       
  86.     return false;  
  87. }  
  88.   
  89. void CloseWSA()  
  90. {  
  91.     WSACleanup();  
  92. }  
  93.   
  94. bool CreateSocket(SOCKET& sock,int type/* =SOCK_STREAM */)  
  95. {  
  96.     sock=socket(AF_INET,type,0);  
  97.       
  98.     if(INVALID_SOCKET == sock)  
  99.     {  
  100.         return false;  
  101.     }  
  102.       
  103.     return true;  
  104. }  
  105.   
  106. bool ConnectToServer(SOCKET& sock,short port ,const char* strIp)  
  107. {  
  108.     SOCKADDR_IN address;  
  109.       
  110.     address.sin_family=AF_INET;       
  111.     address.sin_addr.s_addr=inet_addr(strIp);  
  112.     address.sin_port=htons(port);  
  113.     memset(address.sin_zero,0,sizeof(address.sin_zero));  
  114.   
  115.     if(SOCKET_ERROR == connect(sock,(const struct sockaddr*)&address,sizeof(struct sockaddr)) )  
  116.     {  
  117.         return false;  
  118.     }  
  119.       
  120.     return true;  
  121. }  
  122.   
  123. bool Communicate(SOCKET& sock)  
  124. {  
  125.     bool flag=true;  
  126.     int errCode;  
  127.     char buffer[100]={0};  
  128.   
  129.     while(true)  
  130.     {  
  131.         memset(buffer,0,100);  
  132.         cin.getline(buffer,100);  
  133.         errCode=send(sock,buffer,strlen(buffer),0);  
  134.   
  135.         if(errCode==SOCKET_ERROR)  
  136.         {  
  137.             cout<<"send message error.\n";  
  138.             flag=false;  
  139.             break;  
  140.         }  
  141.       
  142.         memset(buffer,0,100);  
  143.         recv(sock,buffer,100,0);  
  144.         cout<<buffer<<endl;  
  145.     }  
  146.   
  147.     return flag;  
  148. }  
  149.   
  150.   
  151.   
  152. void ExitWithErrorMessage(const string& errMsg)  
  153. {  
  154.     cout<<errMsg<<endl;  
  155.     system("pause");  
  156.     exit(1);  
  157. }  
  158.   
  159. bool CloseSocket(SOCKET& sock)  
  160. {  
  161.     if( closesocket(sock)==SOCKET_ERROR )  
  162.         return false;  
  163.   
  164.     return true;  
  165. }  

 

2 upd编程

UDP Server

[cpp] view plain copy
  1. /************************************************************************/  
  2. /*  
  3. 准备步骤 
  4. #include <WINSOCK2.H> 
  5. #pragma     comment(lib, "ws2_32.lib ") 
  6.  
  7. 0: 加载套接字库(WSAStartup()); 
  8.  
  9. 1:创建套接字(socket()); 
  10.    
  11. 2:绑定套接字到一个IP地址和一个端口上(bind()); 
  12.      
  13. 3:等待和接收数据(sendto()/recvfrom()); 
  14.        
  15. 4:关闭套接字(closesocket()); 
  16.          
  17. 5: 关闭加载的套接字库(WSACleanup()). 
  18.                                                                      */  
  19. /************************************************************************/  
  20.   
  21. #include <WINSOCK2.H>  
  22. #include <windows.h>  
  23. #include <iostream>  
  24. #include <string>  
  25. using namespace std;  
  26. #pragma     comment(lib, "ws2_32.lib ")  
  27.   
  28.   
  29. //0   
  30. bool LoadWSA();  
  31. //1  
  32. bool CreateSocket(SOCKET& sock,int type=SOCK_DGRAM);  
  33. //2  
  34. bool BindSocket(SOCKET& sock,short port ,const char* strIp);  
  35. //4  
  36. bool Communicate(SOCKET& srverSock);  
  37. //5  
  38. bool CloseSocket(SOCKET& sock);  
  39. //6  
  40. void CloseWSA();  
  41.   
  42. void ExitWithErrorMessage(const string& errMsg);  
  43.   
  44.   
  45. void main()  
  46. {  
  47.     if(! LoadWSA() )  
  48.         ExitWithErrorMessage("LoadWSA falid.");  
  49.     cout<<"LoadWSA success.\n";  
  50.   
  51.     SOCKET serSocket;  
  52.     if(! CreateSocket(serSocket) )  
  53.         ExitWithErrorMessage("CreateSocket falid.");  
  54.     cout<<"CreateSocket success.\n";  
  55.   
  56.     if(! BindSocket(serSocket,6000,"127.0.0.1") )  
  57.         ExitWithErrorMessage("BindSocket falid.");  
  58.     cout<<"BindSocket success.\n";  
  59.       
  60.     while(! Communicate(serSocket) );  
  61.     cout<<"Communicate success.\n";  
  62.   
  63.     if(! CloseSocket(serSocket) )  
  64.         ExitWithErrorMessage("CloseSocket falid.");  
  65.     cout<<"CloseSocket success.\n";  
  66.   
  67.     CloseWSA();  
  68. }   
  69.   
  70.   
  71. bool LoadWSA()  
  72. {  
  73.     WSAData wsaData;  
  74.       
  75.     if( 0 == WSAStartup(MAKEWORD(2,2),&wsaData) )  
  76.     {  
  77.         return true;  
  78.     }  
  79.       
  80.     return false;  
  81. }  
  82.   
  83. void CloseWSA()  
  84. {  
  85.     WSACleanup();  
  86. }  
  87.   
  88. bool CreateSocket(SOCKET& sock,int type)  
  89. {  
  90.     sock=socket(AF_INET,type,0);  
  91.       
  92.     if(INVALID_SOCKET == sock)  
  93.     {  
  94.         return false;  
  95.     }  
  96.       
  97.     return true;  
  98. }  
  99.   
  100. bool BindSocket(SOCKET& sock,short port ,const char* strIp)  
  101. {  
  102.     SOCKADDR_IN address;  
  103.       
  104.     address.sin_family=AF_INET;       
  105.     address.sin_addr.s_addr =inet_addr(strIp);  
  106.     address.sin_port=htons(port);  
  107.     memset(address.sin_zero,0,sizeof(address.sin_zero));  
  108.       
  109.     if(SOCKET_ERROR == bind(sock,(const struct sockaddr*)&address,sizeof(struct sockaddr)) )  
  110.     {  
  111.         return false;  
  112.     }  
  113.       
  114.     return true;  
  115. }  
  116.   
  117. bool Communicate(SOCKET& srverSock)  
  118. {  
  119.     bool flag =true;  
  120.     SOCKADDR_IN address;  
  121.     int n=sizeof(struct sockaddr);  
  122.     char buffer[100] = {0};  
  123.   
  124.     if(recvfrom(srverSock,buffer, 100,0,(struct sockaddr*)&address,&n) ==SOCKET_ERROR )  
  125.         flag =false;  
  126.   
  127.     if(flag)  
  128.         cout<<buffer;  
  129.   
  130.     return flag;  
  131. }  
  132.   
  133. void ExitWithErrorMessage(const string& errMsg)  
  134. {  
  135.     cout<<errMsg<<endl;  
  136.     system("pause");  
  137.     exit(1);  
  138. }  
  139.   
  140. bool CloseSocket(SOCKET& sock)  
  141. {  
  142.     if( closesocket(sock)==SOCKET_ERROR )  
  143.         return false;  
  144.       
  145.     return true;  
  146. }  


TCP Client

[cpp] view plain copy
  1. /************************************************************************/  
  2. /*  
  3. 准备步骤 
  4. #include <WINSOCK2.H> 
  5. #pragma     comment(lib, "ws2_32.lib ") 
  6.  
  7. 0: 加载套接字库(WSAStartup()); 
  8.  
  9. 1:创建套接字(socket()); 
  10.  
  11. 2:等待和接收数据(sendto()/recvfrom()); 
  12.        
  13. 3:关闭套接字(closesocket()); 
  14.          
  15. 4: ,关闭加载的套接字库(WSACleanup()). 
  16.                                                                      */  
  17. /************************************************************************/  
  18.   
  19. #include <WINSOCK2.H>  
  20. #include <windows.h>  
  21. #include <iostream>  
  22. #include <string>  
  23. using namespace std;  
  24. #pragma     comment(lib, "ws2_32.lib ")  
  25.   
  26.   
  27. //0   
  28. bool LoadWSA();  
  29. //1  
  30. bool CreateSocket(SOCKET& sock,int type=SOCK_DGRAM);  
  31. //2  
  32. bool Communicate(SOCKET& clientSock,short port ,const char* strIp);  
  33. //3  
  34. bool CloseSocket(SOCKET& sock);  
  35. //4  
  36. void CloseWSA();  
  37.   
  38. void ExitWithErrorMessage(const string& errMsg);  
  39.   
  40.   
  41. void main()  
  42. {  
  43.     if(! LoadWSA() )  
  44.         ExitWithErrorMessage("LoadWSA falid.");  
  45.     cout<<"LoadWSA success.\n";  
  46.   
  47.     SOCKET clientSocket;  
  48.     if(! CreateSocket( clientSocket) )  
  49.         ExitWithErrorMessage("CreateSocket falid.");  
  50.     cout<<"CreateSocket success.\n";  
  51.   
  52.     if(! Communicate( clientSocket,6000,"127.0.0.1") )  
  53.         ExitWithErrorMessage("Communicate falid.");  
  54.     cout<<"Communicate success.\n";  
  55.   
  56.     if(! CloseSocket( clientSocket) )  
  57.         ExitWithErrorMessage("CloseSocket falid.");  
  58.     cout<<"CloseSocket success.\n";  
  59.   
  60.     CloseWSA();  
  61. }   
  62.   
  63.   
  64. bool LoadWSA()  
  65. {  
  66.     WSAData wsaData;  
  67.       
  68.     if( 0 == WSAStartup(MAKEWORD(2,2),&wsaData) )  
  69.     {  
  70.         return true;  
  71.     }  
  72.       
  73.     return false;  
  74. }  
  75.   
  76. void CloseWSA()  
  77. {  
  78.     WSACleanup();  
  79. }  
  80.   
  81. bool CreateSocket(SOCKET& sock,int type)  
  82. {  
  83.     sock=socket(AF_INET,type,0);  
  84.       
  85.     if(INVALID_SOCKET == sock)  
  86.     {  
  87.         return false;  
  88.     }  
  89.       
  90.     return true;  
  91. }  
  92.   
  93.   
  94. bool Communicate(SOCKET& clientSock,short port ,const char* strIp)  
  95. {  
  96.     bool flag =true;  
  97.     SOCKADDR_IN address;  
  98.     int n=sizeof(struct sockaddr);  
  99.   
  100.     address.sin_family=AF_INET;       
  101.     address.sin_addr.s_addr=inet_addr(strIp);  
  102.     address.sin_port=htons(port);  
  103.     memset(address.sin_zero,0,sizeof(address.sin_zero));  
  104.   
  105.     if( sendto(clientSock,"hello , I am from client message."sizeof("hello , I am from server message."),  
  106.         0,(const struct sockaddr*)&address,sizeof(struct sockaddr) ) ==SOCKET_ERROR )  
  107.            flag =false;  
  108.   
  109.     return flag;  
  110. }  
  111.   
  112. void ExitWithErrorMessage(const string& errMsg)  
  113. {  
  114.     cout<<errMsg<<endl;  
  115.     system("pause");  
  116.     exit(1);  
  117. }  
  118.   
  119. bool CloseSocket(SOCKET& sock)  
  120. {  
  121.     if( closesocket(sock)==SOCKET_ERROR )  
  122.         return false;  
  123.       
  124.     return true;  
  125. }  


你可能感兴趣的:(Windows socket 编程汇总)