tcp服务器与客户端

    xiaoxiao2025-10-28  7

    TCP服务端

    Socket->bind->listen->accept->send/recv->close

    创建过程

    1、新建一个常规空项目项目

     

     

    按确定后->按项目(添加新项),如下图->添加

     

     

    2、增加代码,试运行,查看程序是否出错

     

      程序代码如下:

                             #include<stdio.h>

                        #include<stdlib.h>

     

                        void main(void)

                       {

                         printf(“hello\n”);

                         System(“pause”);

                       }

    3、注释掉上面的内容,输入下列工程代码

     

       程序代码如下:

    #pragma comment(lib,"ws2_32.lib")

    #include<WinSock2.h>

    #include<stdio.h>

    #include<stdlib.h>

     

    void main(void)

    {

    WSADATA    wsData;

    int ClientAddrLen;//客户端地址长度

    SOCKADDR_IN ClientAddr;//客户端地址

    SOCKET ListeningSocket;

    SOCKADDR_IN ServerAddr;//服务器地址

    char DataBufer[1024];

    int Ret;

    SOCKET NewConnect;

     

    int Port = 5150;

     

    if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsData)) != 0)

    //初始化windows套接字

    {

    printf("=WSAStartup failed with error %d\n", Ret);

    return;

    }

    if( (ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)

    //创建服务器端流式套接字,需用TCP协议

    {

               printf("socket failed with error d\n,WAGetLastError()");

               //得到错误信息

    WSACleanup();//清理

    return;

    }

    ServerAddr.sin_family = AF_INET;

    //套接;inter net协议

    ServerAddr.sin_port = htons(Port);

    //本机字节转化为网络字节

    ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//不限制客户端IP

    if ((bind(ListeningSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr))) == SOCKET_ERROR)

    {

                printf("bind failed with error %d\n", WSAGetLastError());

    closesocket(ListeningSocket);

    WSACleanup();

    return;

    }

     

    //设置监听,队列中最多有5个排列

    if ((listen(ListeningSocket,5))==SOCKET_ERROR)

    {

                printf("listen failed with error %d\n", WSAGetLastError());

    closesocket(ListeningSocket);

    WSACleanup();

    return;

    }

     

                   printf("We are waiting a connection on port %d:\n",Port);

    printf("liten(正在监听)...\n");

    ClientAddrLen = sizeof(SOCKADDR);

    if((NewConnect=accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen))==INVALID_SOCKET)

        {

    printf("accept failed with error %d\n", WSAGetLastError());

    closesocket(ListeningSocket);

    WSACleanup();

    return;

    }

     

    printf("We successfully got a connect from %s: %d\n", inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));

    closesocket(ListeningSocket);//在强大就不用关闭

    printf("We are waiting to receive data \n");

     

     

     

    if ((Ret=recv(NewConnect, DataBufer,sizeof( DataBufer), 0)) == SOCKET_ERROR)

    {

                  printf("recv failed with error %d\n", WSAGetLastError());

    closesocket(NewConnect);

    WSACleanup();

    return;

    }

     

     

    printf("We successfully receive %d bytes\n", Ret);

    DataBufer[Ret] = '\0';

    printf("%s\n",DataBufer);

                 printf("We are now going to close the client connection\n");

    closesocket(NewConnect);

    WSACleanup();

    return;

    system("pause");

     

    }

     

    4、运行以上代码,找到运行出的exe文件,将其复制到c盘的新建的文件夹中

     

     

    客户端

    Socket->connect->send/recv->close

    创建过程

     

    1、2如同服务端的1、2。

    3、注释掉上面的内容,输入下列工程代码

     

       程序代码如下:

    #pragma comment(lib,"ws2_32.lib")

    #include<WinSock2.h>

    #include<stdio.h>

    #include<stdlib.h>

     

    void main(int argc, char**argv)

    {

    WSADATA    wsData;

    int Ret;

    SOCKET s;

    SOCKADDR_IN ServerAddr;

    int Port = 5555;

    if (argc<=1)

    {

    printf("USAGE:TCP客户端<Server IP address>\n");

    //system("pause");

    return;

    }

     

    if ((Ret=WSAStartup(MAKEWORD(2,2),&wsData))!=0)

    {

    printf("=WSAStartup failed with error %d\n", Ret);

    return;

    }

    if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)

    {

    printf("socket failed with error d\n,WAGetLastError()");

    WSACleanup();

    return;

    }

    ServerAddr.sin_family = AF_INET;

    ServerAddr.sin_port = htons(Port);

    ServerAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);

    printf("We are trying to connect to %s:%d\n", inet_ntoa(ServerAddr.sin_addr), htons(ServerAddr.sin_port));

    if (connect(s, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR)

    {

    printf("connect failed with error %d\n", WSAGetLastError());

    closesocket(s);

    WSACleanup();

    return;

    }

     

    printf("Our connect succeeded\n");

    printf("We will now try to send a hello message\n");

    if ((Ret=send(s,"hello",5,0))==SOCKET_ERROR)

    {

    printf("send failed with error %d\n", WSAGetLastError());

    closesocket(s);

    WSACleanup();

    return;

    }

     

     

    printf("We successfully send %d bytes\n", Ret);

    printf("We are closing the connect\n");

    closesocket(s);

    WSACleanup();

    return;

    system("pause");

     

    }

     

    4、运行以上代码,找到运行出的exe文件,将其复制到c盘的新建的文件夹中

     

     

     

    5、打开运行窗口输入以下命令运行TCP服务器

    cd\

    cd 你的exe文件所在的文件夹

     

    6、在打开一个运行窗口口输入一下命令

    cd\

    cd 你的exe文件所在的文件夹  设备的IP

    只要是获取本机IP都可以输入127.0.0.1

     

     

     

     

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1303608.html
    最新回复(0)