socket编程(二)TCP cpp

本文提供了TCP Socket编程的C++示例代码,包括服务器端和客户端的实现细节。通过一个简单的聊天应用展示了如何创建套接字、绑定地址、监听连接请求、接收数据及发送响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP cpp socket

这里的cpp实现可以对比这里的Python实现一起食用,效果更佳
下面代码参考 http://www.tuicool.com/articles/MfaI7bY (其实基本是抄袭~~~)

TCPServer.cpp

//
// Created by hui on 16-11-22.
//
/**
 * This file is a test for tcp server using socket
 * visit    http://www.tuicool.com/articles/MfaI7bY
 *
 * step is:
 *      socket : declear a socket
 *      bind : bind Server IP and Port
 *      listen : set max listen number
 *      accept : using dead loop to wait client connect in.
 *      recv/send : always run in an independent thread to send or recv data with client.
 *      close: after done something close all socket.
 */

#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define SERVER_PORT 10000

int main(){
    int serverSocket;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int addr_len = sizeof(client_addr);
    int connectionSocket;
    char buffer[200];
    int iDataNum;

    /** create a socket for server
     *  doamain : AF_INET means ipv4
     *  type    : SOCK_STREAM , usually use with TCP
     *  protocol: IPPROTO_IP is Dummy protocol for TCP,会自动选择type类型对应的默认协议
     * */
    if((serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) < 0){
        perror("socket");
        return 1;
    }

    /** bind server socket with (IP, PORT) */
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;       // using ipv4
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(serverSocket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){
        perror("connect");
        return 1;
    }

    /** set the max listen number to 5 */
    if(listen(serverSocket, 5) < 0){
        perror("listen");
        return 1;
    }

    /** open a dead loop to wait client to connect in */
    while(1){
        printf("Listening on port: %d\n", SERVER_PORT);
        connectionSocket = accept(serverSocket, (struct sockaddr*)&client_addr, (socklen_t*)&addr_len);
        if(connectionSocket < 0){
            perror("accept");
            continue;
        }

        /** if connection had been set up, then recv or send data with client */
        printf("\nrecv data from %s:%d\n", inet_ntoa(client_addr.sin_addr), htons(client_addr.sin_port));
        while(1){
            iDataNum = (int)recv(connectionSocket, buffer, 1024, 0);
            if(iDataNum < 0){
                perror("receive");
                continue;
            }
            buffer[iDataNum] = '\0';
            if(strcmp(buffer, "over") == 0 || strcmp(buffer, "quit") == 0) {
                close(connectionSocket);
                break;
            }
            printf("recv %d bytes data is:\n%s\n", iDataNum, buffer);
            send(connectionSocket, buffer, (size_t)iDataNum, 0);
        }
        if(strcmp(buffer, "quit") == 0) {
            close(serverSocket);
            break;
        }
    }
    return 0;
}

TCPClient.cpp

//
// Created by hui on 16-11-22.
//

/**
 * This is a test file for TCP Client using socket
 * visit    http://www.tuicool.com/articles/MfaI7bY
 *
 * steps:
 *      socket : create a cleint socket
 *      connect : connect to server socket
 *      recv/send : excahnge data with server in a dead loop
 *      clsoe: close socket
*/

/*socket tcp客户端*/
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define SERVER_PORT 10000

int main(){
    int clientSocket;
    struct sockaddr_in server_addr;
    char sendbuf[200];
    char recvbuf[200];
    int iDataNum;
    if((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        perror("socket");
        return 1;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    if(connect(clientSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
        perror("connect");
        return 1;
    }

    printf("connect with destination host...\n");
    while(1){
        printf("Input your world:>");
        scanf("%s", sendbuf);                   // read a word, space or \n to end input
        printf("\n");

        send(clientSocket, sendbuf, strlen(sendbuf), 0);
        if(strcmp(sendbuf, "quit") == 0) break;
        iDataNum = (int)recv(clientSocket, recvbuf, 200, 0);
        recvbuf[iDataNum] = '\0';
        printf("recv data of my world is: %s\n", recvbuf);
    }
    close(clientSocket);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值