tcp通信

服务端

// c_tcp_server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <winsock.h>
#pragma comment(lib,"Ws2_32")
#define MYPORT 6666 /*定义用户连接端口*/
#define BACKLOG 10 /*多少等待连接控制*/ 
#define MAXDATASIZE 100    /* 每次可以接收的最大字节 */

int main()
{
    int sockfd, new_fd; /*定义套接字*/
    struct sockaddr_in my_addr; /*本地地址信息 */
    struct sockaddr_in their_addr; /*连接者地址信息*/
    int sin_size, numbytes; 
    char msg[MAXDATASIZE], buf[MAXDATASIZE];
    WSADATA ws;
    WSAStartup(MAKEWORD(2, 2), &ws); //初始化Windows Socket Dll
    //建立socket
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        //如果建立socket失败,退出程序
        printf("socket error\n");
        exit(1);
    }
    //bind本机的MYPORT端口
    my_addr.sin_family = AF_INET; /* 协议类型是INET */
    my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口*/
    my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP*/
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
    {
        //bind失败,退出程序
        printf("bind error\n");
        closesocket(sockfd);
        exit(1);
    }
    //listen,监听端口
    if (listen(sockfd, BACKLOG) == -1)
    {
        //listen失败,退出程序
        printf("listen error\n");
        closesocket(sockfd);
        exit(1);
    }
    printf("listen...");
    //等待客户端连接
    sin_size = sizeof(struct sockaddr_in);
    if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
    {
        printf("accept error\n");
        closesocket(sockfd);
        exit(1);
    }
    printf("\naccept!\n");
    while (1) 
    {
        //接收客户端发来的消息
        if ((numbytes = recv(new_fd, buf, MAXDATASIZE, 0)) == -1) continue;
        if (!strcmp(buf, "bye"))
        {
            //成功,关闭套接字
            closesocket(sockfd);
            closesocket(new_fd);
            return 0;
        }
        printf("from client:%s;\nmsg length:%d\n", buf, strlen(buf));

        //发送回给客户端
        memset(msg, 0, MAXDATASIZE);
        printf("send to client:");
        std::cin >> msg;
        if (send(new_fd, msg, MAXDATASIZE, 0) == -1)
        {
            printf("send ERRO");
            closesocket(sockfd);
            closesocket(new_fd);
            return 0;
        }
    }
}

客户端

// c_tcp_client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <winsock.h>
#pragma comment(lib,"Ws2_32")
#define PORT 6666 /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */

int main()
{
    int sockfd, numbytes;
    char buf[MAXDATASIZE];
    char msg[MAXDATASIZE];
    const char * argv = "127.0.0.1";
    struct sockaddr_in their_addr; /* 对方的地址端口信息 */
    WSADATA ws; 
    WSAStartup(MAKEWORD(2, 2), &ws); //初始化Windows Socket Dll
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        //如果建立socket失败,退出程序
        printf("socket error\n");
        exit(1);
    }
    //连接对方
    their_addr.sin_family = AF_INET; /* 协议类型是INET */
    their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */
    their_addr.sin_addr.s_addr = inet_addr(argv); /* 连接对方的IP */
    if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
    {
        //如果连接失败,退出程序
        printf("connet error\n");
        closesocket(sockfd);
        exit(1);
    }
    while (1) {
        memset(msg, 0, MAXDATASIZE);
        printf("send to server:");
        scanf_s("%s", msg, (unsigned)_countof(msg));
        //发送数据给服务端
        if (send(sockfd, msg, MAXDATASIZE, 0) == -1)
        {
            printf("send error");
            closesocket(sockfd);
            exit(1);
        }

        //接收从服务端发回的数据,并打印出来
        memset(buf, 0, MAXDATASIZE);
        if ((numbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
        {
            //接收数据失败,退出程序
            printf("recv error\n");
            closesocket(sockfd);
            exit(1);
        }
        buf[strlen(buf) + 1] = '\0';
        printf("msg from client: %s;\nmsg length:%d\n", buf, strlen(buf));
    }
    closesocket(sockfd);
    return 0;
}

 服务端和客户端的通信是一问一答的模式。

posted @ 2019-05-16 15:57  N_zero  阅读(168)  评论(0)    收藏  举报