zl程序教程

您现在的位置是:首页 >  其它

当前栏目

win32 socket的一个简单的例子 控制台

一个 简单 例子 socket 控制台 Win32
2023-09-11 14:16:45 时间



在visual c++里建两个win32控制台工程,分别编译下面的服务端和客户端

服务端:

  1. #include <windows.h>  
  2. #include <iostream.h>  
  3. #include <winsock.h>  
  4. #pragma comment(lib,"ws2_32.lib")  
  5.   
  6. #define NO_FLAGS_SET 0  
  7. #define PORT (u_short)44965  
  8. #define MAXBUFLEN 256  
  9.   
  10. //服务器 -- VC++ Socket编程 简单的Tcp/ip服务器  
  11. int main()  
  12. {  
  13. WSADATA Data;  
  14. SOCKADDR_IN serverSockAddr;  
  15. SOCKADDR_IN clientSockAddr;  
  16. SOCKET serverSocket;  
  17. SOCKET clientSocket;  
  18. int addrLen=sizeof(SOCKADDR_IN);  
  19. int status;  
  20. int numrcv;  
  21. char buffer[MAXBUFLEN];  
  22.   
  23. /* initialize the Windows Socket DLL */  
  24. status=WSAStartup(MAKEWORD(1, 1), &Data);  
  25. if (status != 0)  
  26.    cerr << "ERROR: WSAStartup unsuccessful" << endl;  
  27.   
  28. /* zero the sockaddr_in structure */  
  29. memset(&serverSockAddr, 0, sizeof(serverSockAddr));  
  30.   
  31. /* specify the port portion of the address */  
  32. serverSockAddr.sin_port=htons(PORT);  
  33. /* specify the address family as Internet */  
  34. serverSockAddr.sin_family=AF_INET;  
  35. /* specify that the address does not matter */  
  36. serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);  
  37.   
  38. /* create a socket socket(通信发生的区域,套接字的类型,套接字使用的特定协议) */  
  39. serverSocket = socket(AF_INET, SOCK_STREAM, 0);  
  40. if (serverSocket == INVALID_SOCKET)  
  41.    cerr << "ERROR: socket unsuccessful" << endl;  
  42.   
  43. /* associate the socket with the address */  
  44. status=bind(serverSocket, (LPSOCKADDR)&serverSockAddr, sizeof(serverSockAddr));  
  45. if (status == SOCKET_ERROR)  
  46.    cerr << "ERROR: bind unsuccessful" << endl;  
  47.   
  48. /* allow the socket to take connections listen(已建立、尚未连接的套接字号,连接队列的最大长度) */  
  49. status=listen(serverSocket, 1);  
  50. if (status == SOCKET_ERROR)  
  51.    cerr << "ERROR: listen unsuccessful" << endl;  
  52.   
  53. /* accept the connection request when one is received */  
  54. clientSocket=accept(serverSocket, (LPSOCKADDR)&clientSockAddr, &addrLen);  
  55.   
  56. cout << "Got the connection..." << endl;  
  57.   
  58. while(1)  
  59. {  
  60.    /* recv(已连接的套接字, 接收输入数据缓冲区的指针, 缓冲区大小, 传输控制方式) */  
  61.    numrcv=recv(clientSocket, buffer, MAXBUFLEN, NO_FLAGS_SET);  
  62.    if ((numrcv == 0) || (numrcv == SOCKET_ERROR))  
  63.    {  
  64.     cout << "Connection terminated." << endl;  
  65.      
  66.     status=closesocket(clientSocket);  
  67.     if (status == SOCKET_ERROR)  
  68.      cerr << "ERROR: closesocket unsuccessful" << endl;  
  69.      
  70.     status=WSACleanup();  
  71.     if (status == SOCKET_ERROR)  
  72.      cerr << "ERROR: WSACleanup unsuccessful" << endl;  
  73.     return(1);  
  74.    }  
  75.    cout << buffer << endl;  
  76. /* while */  
  77. }  
#include <windows.h>
#include <iostream.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")

#define NO_FLAGS_SET 0
#define PORT (u_short)44965
#define MAXBUFLEN 256

//服务器 -- VC++ Socket编程 简单的Tcp/ip服务器
int main()
{
WSADATA Data;
SOCKADDR_IN serverSockAddr;
SOCKADDR_IN clientSockAddr;
SOCKET serverSocket;
SOCKET clientSocket;
int addrLen=sizeof(SOCKADDR_IN);
int status;
int numrcv;
char buffer[MAXBUFLEN];

/* initialize the Windows Socket DLL */
status=WSAStartup(MAKEWORD(1, 1), &Data);
if (status != 0)
   cerr << "ERROR: WSAStartup unsuccessful" << endl;

/* zero the sockaddr_in structure */
memset(&serverSockAddr, 0, sizeof(serverSockAddr));

/* specify the port portion of the address */
serverSockAddr.sin_port=htons(PORT);
/* specify the address family as Internet */
serverSockAddr.sin_family=AF_INET;
/* specify that the address does not matter */
serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);

/* create a socket socket(通信发生的区域,套接字的类型,套接字使用的特定协议) */
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET)
   cerr << "ERROR: socket unsuccessful" << endl;

/* associate the socket with the address */
status=bind(serverSocket, (LPSOCKADDR)&serverSockAddr, sizeof(serverSockAddr));
if (status == SOCKET_ERROR)
   cerr << "ERROR: bind unsuccessful" << endl;

/* allow the socket to take connections listen(已建立、尚未连接的套接字号,连接队列的最大长度) */
status=listen(serverSocket, 1);
if (status == SOCKET_ERROR)
   cerr << "ERROR: listen unsuccessful" << endl;

/* accept the connection request when one is received */
clientSocket=accept(serverSocket, (LPSOCKADDR)&clientSockAddr, &addrLen);

cout << "Got the connection..." << endl;

while(1)
{
   /* recv(已连接的套接字, 接收输入数据缓冲区的指针, 缓冲区大小, 传输控制方式) */
   numrcv=recv(clientSocket, buffer, MAXBUFLEN, NO_FLAGS_SET);
   if ((numrcv == 0) || (numrcv == SOCKET_ERROR))
   {
    cout << "Connection terminated." << endl;
   
    status=closesocket(clientSocket);
    if (status == SOCKET_ERROR)
     cerr << "ERROR: closesocket unsuccessful" << endl;
   
    status=WSACleanup();
    if (status == SOCKET_ERROR)
     cerr << "ERROR: WSACleanup unsuccessful" << endl;
    return(1);
   }
   cout << buffer << endl;
} /* while */
}


====================================================================================================

客户端:

  1. #include <windows.h>  
  2. #include <winsock.h>  
  3. #include <iostream.h>  
  4. #pragma comment(lib,"ws2_32.lib")  
  5.   
  6. #define NO_FLAGS_SET 0  
  7. #define PORT (u_short)44965  
  8. #define DEST_IP_ADDR "192.168.0.7" //Server address  
  9.   
  10. //客户端 --VC++ Socket编程 简单的Tcp/ip客户端  
  11. int main()  
  12. {  
  13. WSADATA Data;  
  14. SOCKADDR_IN destSockAddr;  
  15. SOCKET destSocket;  
  16. unsigned long destAddr;  
  17. int status;  
  18. int numsnt;  
  19. char *toSendtxt="Test String";  
  20.   
  21. /* initialize the Windows Socket DLL */  
  22. status=WSAStartup(MAKEWORD(1, 1), &Data);  
  23. if (status != 0)  
  24.    cerr << "ERROR: WSAStartup unsuccessful" << endl;  
  25.   
  26. /* convert IP address into in_addr form */  
  27. destAddr=inet_addr(DEST_IP_ADDR);  
  28. /* copy destAddr into sockaddr_in structure */  
  29. memcpy(&destSockAddr.sin_addr, &destAddr, sizeof(destAddr));  
  30. /* specify the port portion of the address */  
  31. destSockAddr.sin_port=htons(PORT);  
  32. /* specify the address family as Internet */  
  33. destSockAddr.sin_family=AF_INET;  
  34.   
  35. /* create a socket */  
  36. destSocket=socket(AF_INET, SOCK_STREAM, 0);  
  37. if (destSocket == INVALID_SOCKET)  
  38. {  
  39.    cerr << "ERROR: socket unsuccessful" << endl;  
  40.     
  41.    status=WSACleanup();  
  42.    if (status == SOCKET_ERROR)  
  43.     cerr << "ERROR: WSACleanup unsuccessful" << endl;  
  44.    return(1);  
  45. }  
  46.   
  47. cout << "Trying to connect to IP Address: " << DEST_IP_ADDR << endl;  
  48.   
  49. /* connect to the server */  
  50. status=connect(destSocket, (LPSOCKADDR)&destSockAddr, sizeof(destSockAddr));  
  51. if (status == SOCKET_ERROR)  
  52. {  
  53.    cerr << "ERROR: connect unsuccessful" << endl;  
  54.     
  55.    status=closesocket(destSocket);  
  56.    if (status == SOCKET_ERROR)  
  57.     cerr << "ERROR: closesocket unsuccessful"  
  58.     << endl;  
  59.    status=WSACleanup();  
  60.    if (status == SOCKET_ERROR)  
  61.     cerr << "ERROR: WSACleanup unsuccessful"  
  62.     << endl;  
  63.    return(1);  
  64. }  
  65.   
  66. cout << "Connected..." << endl;  
  67.   
  68. while(1)  
  69. {  
  70.    cout << "Sending..." << endl;  
  71.    numsnt=send(destSocket, toSendtxt, strlen(toSendtxt) + 1, NO_FLAGS_SET);  
  72.    if (numsnt != (int)strlen(toSendtxt) + 1)  
  73.    {  
  74.     cout << "Connection terminated" << endl;  
  75.      
  76.     status=closesocket(destSocket);  
  77.     if (status == SOCKET_ERROR)  
  78.      cerr << "ERROR: closesocket unsuccessful" << endl;  
  79.     status=WSACleanup();  
  80.     if (status == SOCKET_ERROR)  
  81.      cerr << "ERROR: WSACleanup unsuccessful" << endl;  
  82.     return(1);  
  83.    }  
  84.     
  85.    /* Wait before sending the message again */  
  86.    Sleep(1000);  
  87. /* while */  
  88. }