• socket编程学习step1


    socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768

    sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据包套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程采用的都是流式套接字。

    服务端socket编程步骤:

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

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

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

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

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

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

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

    客户端socket编程步骤:

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

    2、向服务端发送连接请求(connect());

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

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

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

    1.加载方法:

    WSADATA wsa;
    /*初始化socket资源*/
    if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
    {
        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)

    server端:

     1 #include "stdafx.h"
     2 #include <stdio.h>
     3 #include <winsock2.h>
     4 
     5 #pragma comment(lib,"ws2_32.lib")
     6 
     7 int main(int argc, char* argv[])
     8 {
     9     //初始化WSA(Windows Sockets API)
    10     WORD sockVersion = MAKEWORD(2, 2);    //高8位设置2,低8位设置2
    11     WSADATA wsaData;
    12     if (WSAStartup(sockVersion, &wsaData) != 0)      //sockVersion是一个int型变量
    13     {
    14         return 0;
    15     }
    16 
    17     //创建套接字
    18     SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //socket(int family, int type, int protocol)
    19     if (slisten == INVALID_SOCKET)
    20     {
    21         printf("socket error !");
    22         return 0;
    23     }
    24 
    25     //绑定IP和端口
    26     sockaddr_in sin;
    27     sin.sin_family = AF_INET;               //协议域
    28     sin.sin_port = htons(8888);             //端口
    29     sin.sin_addr.S_un.S_addr = INADDR_ANY;  //协议地址
    30     if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) //bind(SOCKET sock, const struct sockaddr *addr)
    31     {
    32         printf("bind error !");
    33     }
    34 
    35     //开始监听
    36     if (listen(slisten, 5) == SOCKET_ERROR)
    37     {
    38         printf("listen error !");
    39         return 0;
    40     }
    41 
    42     //循环接收数据
    43     SOCKET sClient;
    44     sockaddr_in remoteAddr;
    45     int nAddrlen = sizeof(remoteAddr);
    46     char revData[255];
    47     while (true)
    48     {
    49         printf("等待连接...
    ");
    50         sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
    51         if (sClient == INVALID_SOCKET)
    52         {
    53             printf("accept error !");
    54             continue;
    55         }
    56         printf("接受到一个连接:%s 
    ", inet_ntoa(remoteAddr.sin_addr));
    57 
    58         //接收数据
    59         int ret = recv(sClient, revData, 255, 0);
    60         if (ret > 0)
    61         {
    62             revData[ret] = 0x00;
    63             printf(revData);
    64         }
    65 
    66         //发送数据
    67         char * sendData = "你好,TCP客户端!
    ";
    68         send(sClient, sendData, strlen(sendData), 0);
    69         closesocket(sClient);
    70     }
    71 
    72     closesocket(slisten);
    73     WSACleanup();
    74     return 0;
    75 }
    View Code

    client端:

     1 #include "stdafx.h"
     2 #include <WINSOCK2.H>
     3 #include <STDIO.H>
     4 
     5 #pragma  comment(lib,"ws2_32.lib")
     6 
     7 
     8 int main(int argc, char* argv[])
     9 {
    10     WORD sockVersion = MAKEWORD(2,2);
    11     WSADATA data; 
    12     if(WSAStartup(sockVersion, &data) != 0)
    13     {
    14         return 0;
    15     }
    16 
    17     SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    18     if(sclient == INVALID_SOCKET)
    19     {
    20         printf("invalid socket !");
    21         return 0;
    22     }
    23 
    24     sockaddr_in serAddr;
    25     serAddr.sin_family = AF_INET;
    26     serAddr.sin_port = htons(8888);
    27     serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
    28     if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
    29     {
    30         printf("connect error !");
    31         closesocket(sclient);
    32         return 0;
    33     }
    34     char * sendData = "你好,TCP服务端,我是客户端!
    ";
    35     send(sclient, sendData, strlen(sendData), 0);
    36 
    37     char recData[255];
    38     int ret = recv(sclient, recData, 255, 0);
    39     if(ret > 0)
    40     {
    41         recData[ret] = 0x00;
    42         printf(recData);
    43     }
    44     closesocket(sclient);
    45     WSACleanup();
    46     return 0;
    47 }
    View Code
  • 相关阅读:
    JAVA——return浅析
    JAVA泛型【转】
    C#——WinForm修改密码
    java获取当前时间的方式【转】
    iOS 取得单张系统图片
    iOS UIView的简单渐变效果
    UIView 添加子视图的常用方法
    IOS之UIView的tag学习
    OC学习笔记之属性详解和易错点
    oc对象函数什么时候返回值类型使用instancetype
  • 原文地址:https://www.cnblogs.com/kane0526/p/5885385.html
Copyright © 2020-2023  润新知