SOCKET 編程基礎

(TCP)服務器端SOCKET

第一步:初始化套接字庫

第二步:創建套接字

第三步:綁定套接字

第四步:將該套接字置爲監聽狀態

第五步:接收客戶端傳來的連接請求

(TCP)客戶端SOCKET

第一步:初始化套接字庫

第二步:創建套接字

第三步:綁定套接字

第四步:向服務器端發送連接請求

 

 

 

(UDP)服務器端SOCKET

第一步:初始化套接字庫

第二步:創建套接字

第三步:綁定套接字

第四步:向指定IP發送數據

(UDP)客戶端SOCKET

第一步:初始化套接字庫

第二步:創建套接字

第三步:綁定套接字

第四步:向指定IP發送數據

 

基於UDP的socket編程

sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基於UDP的socket編程是採用的數據報套接字。

在這個程序中,將兩個工程添加到一個工作區。同時還要鏈接一個ws2_32.lib的庫文件。

服務器端編程的步驟:

1:加載套接字庫,創建套接字(WSAStartup()/socket());

2:綁定套接字到一個IP地址和一個端口上(bind());

3:等待和接收數據(sendto()/recvfrom());

4:關閉套接字,關閉加載的套接字庫(closesocket()/WSACleanup())。

 

服務器端代碼如下:

#include <winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
   return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 )
{
   WSACleanup( );
   return;
}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7003);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf[50];
SOCKADDR addrClient;
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);
printf("%s/n",recvBuf);

closesocket(sockSrv);
WSACleanup();
}

 

對於基於UDP的socket客戶端來說,要進行如下步驟:

1:創建一個套接字(socket);

2:向服務器發送數據(sendto);

3:關閉套接字;

代碼如下:

#include <winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
   return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
   WSACleanup( );
   return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(8889);
SOCKADDR_IN addrSrv;
sendto(sockClient,"hi",3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
}

 

VC++ Socket編程 簡單的Tcp/ip服務器端

#include <windows.h>
#include <iostream.h>
#include <winsock.h>

#define NO_FLAGS_SET 0

#define PORT (u_short) 44965
#define MAXBUFLEN 256

INT main(VOID)
{
  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 */
  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 */
  status=listen(serverSocket, 6);
  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)
  {
    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 */

}

 

VC++ Socket編程 簡單的Tcp/ip客戶端

 

#include <windows.h>
#include <iostream.h>
#include <winsock.h>

#define NO_FLAGS_SET 0

#define PORT (u_short) 44965
#define DEST_IP_ADDR "192.168.10.158" //Server address

INT main(VOID)
{
   WSADATA Data;
   SOCKADDR_IN destSockAddr;
   SOCKET destSocket;
   unsigned long destAddr;
   int status;
   int numsnt;
   char *toSendtxt="Test String";

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

   /* convert IP address into in_addr form */
   destAddr=inet_addr(DEST_IP_ADDR);
   /* copy destAddr into sockaddr_in structure */
   memcpy(&destSockAddr.sin_addr,
     &destAddr, sizeof(destAddr));
   /* specify the port portion of the address */
   destSockAddr.sin_port=htons(PORT);
   /* specify the address family as Internet */
   destSockAddr.sin_family=AF_INET;

   /* create a socket */
   destSocket=socket(AF_INET, SOCK_STREAM, 0);
   if (destSocket == INVALID_SOCKET)
   {
     cerr << "ERROR: socket unsuccessful" << endl;
     status=WSACleanup();
     if (status == SOCKET_ERROR)
       cerr << "ERROR: WSACleanup unsuccessful"
         << endl;
     return(1);
   }

   cout << "Trying to connect to IP Address: "
     << DEST_IP_ADDR << endl;

   /* connect to the server */
   status=connect(destSocket,
     (LPSOCKADDR) &destSockAddr,
     sizeof(destSockAddr));
   if (status == SOCKET_ERROR)
   {
     cerr << "ERROR: connect unsuccessful" << endl;
     status=closesocket(destSocket);
     if (status == SOCKET_ERROR)
       cerr << "ERROR: closesocket unsuccessful"
         << endl;
     status=WSACleanup();
     if (status == SOCKET_ERROR)
       cerr << "ERROR: WSACleanup unsuccessful"
         << endl;
     return(1);
   }

   cout << "Connected..." << endl;

   while(1)
   {
     cout << "Sending..." << endl;
     numsnt=send(destSocket, toSendtxt,
       strlen(toSendtxt) + 1, NO_FLAGS_SET);
     if (numsnt != (int)strlen(toSendtxt) + 1)
     {
       cout << "Connection terminated" << endl;
       status=closesocket(destSocket);
       if (status == SOCKET_ERROR)
         cerr << "ERROR: closesocket unsuccessful"
           << endl;
       status=WSACleanup();
       if (status == SOCKET_ERROR)
         cerr << "ERROR: WSACleanup unsuccessful"
           << endl;
       return(1);
     }

   /* Wait before sending the message again */
   Sleep(4800);
   } /* while */
}

 

發佈了17 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章