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 */
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值