windows下网络编程TCP

转载 

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);

基于TCP的socket编程

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

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

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

第一步: 加载/释放Winsock库:

1.加载方法:

WSADATA wsaData;
  WORD wVersionRequested = MAKEWORD(2, 2);
  /*初始化socket资源*/
  if (WSAStartup(wVersionRequested, &wsaData) != 0)
      return;
  //代表失败
  if (LOBYTE(wsaData.wVersion) != 2 ||
  HIBYTE(wsaData.wVersion) != 2)
  {
                               
      WSACleanup();  
      return;
  }

 

 

2.释放方法:

WSACleanup();

 

 

第二步: 构造SOCKET:

1.服务端:构造监听SOCKET,流式SOCKET.
   SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0)

2.客户端:构造通讯SOCKET,流式SOCKET.
SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0)

第三步:配置监听地址和端口:

1.服务端: SOCKADDR_IN serverAddr
   ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
   serverAddr.sin_family = AF_INET;
   serverAddr.sin_port = htons(1234);           /*本地监听端口:1234*/
   serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/

第四步:   绑定SOCKET:

1.服务端:绑定监听SOCKET.
  bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr))

第五步: 服务端/客户端连接:

1.服务端:等待客户端接入.
   SOCKET Command_Sock = accept(Listen_Sock, ...)

2.客户端:请求与服务端连接.
int ret = connect(Client_Sock, ...)

第六步: 收/发数据:

1.服务端:等待客户端接入.char buf[1024].
    接收数据:recv(Command_Sock,buf, ...)

    发送数据:send(Command_Sock,buf, ...)

2.客户端:请求与服务端连接.char buf[1024].
    发送数据:send(Client_Sock,buf, ...)

    接收数据:recv(Client_Sock,buf, ...)

第七步: 关闭SOCKET:

1.服务端:关闭SOCKET.
   closesocket(Listen_Sock)
closesocket(Command_Sock)

2.客户端:关闭SOCKET.
closesocket(Client_Sock)

服务器代码

#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
    //初始化socket资源
    WSADATA wsa;
    if (NOERROR != WSAStartup(MAKEWORD(1, 1), &wsa))
    {
        return 1; //代表失败
    }
    SOCKET sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sockaddr_in addrServer;
    addrServer.sin_family = AF_INET;
    addrServer.sin_addr.s_addr = inet_addr("127.0.0.1");
    addrServer.sin_port = htons(24583);
    bind(sockServer, (SOCKADDR *)&addrServer, sizeof(addrServer));
    listen(sockServer, SOMAXCONN);

    SOCKET AcceptSocket = accept(sockServer, NULL, NULL);
    cout << "连接OK" << endl;
    send(AcceptSocket, "zhao", sizeof("zhao"), 0);
    cout << "服务器--->客户端" << endl << "发的消息为:" << "zhao" << endl;
    system("pause");
    WSACleanup();
    return 0;
}

 

客户端代码

#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define DEFAULT_BUFLEN 512
int _tmain(int argc, _TCHAR* argv[])
{
    //初始化socket资源
    WSADATA wsa;
    if (NOERROR != WSAStartup(MAKEWORD(1, 1), &wsa))
    {
        return 1; //代表失败
    }
    SOCKET sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sockaddr_in addrServer;
    addrServer.sin_family = AF_INET;
    addrServer.sin_addr.s_addr = inet_addr("127.0.0.1");
    addrServer.sin_port = htons(24583);
    connect(sockClient, (SOCKADDR *)&addrServer, sizeof(addrServer));
    char recvbuf[DEFAULT_BUFLEN] = { 0 };
    recv(sockClient, recvbuf, DEFAULT_BUFLEN, 0);
    cout << "客户端接收到的消息为: " << recvbuf << endl;

    system("pause");
    WSACleanup();
    return 0;
}

 

posted @ 2018-05-21 14:30  zwj鹿港小镇  阅读(954)  评论(0编辑  收藏  举报