TCP通信---服务器和客户端程序

该博客展示了如何使用C语言实现一个简单的TCP服务器和客户端。服务器端通过`server_init`初始化并监听指定端口,等待客户端连接。当客户端连接成功后,服务器读取客户端发送的数据,如果接收到特定指令(如'sl'),则执行对应系统命令。客户端通过`client_init`初始化,并连接到服务器,接收用户输入并发送到服务器。这是一个基础的网络通信模型,有助于理解TCP/IP协议栈的工作原理。
摘要由CSDN通过智能技术生成

先上传代码,后续再补充

tcp_server.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>

#define SIZE 1024


int server_init(char* addr,int port,int max_listen_queue);//socket\bind\listen
int wait_for_client(int listen_fd);


int main(int argc, char *argv[])
{ 
    char recvbuf[SIZE] = {0};

    //int listen_fd = server_init("127.0.0.1",2234,10);
    int listen_fd = server_init("192.168.2.39",2234,10);
    while(1)
    {
        int connt_fd = wait_for_client(listen_fd);
        while(1)
        {
            memset(recvbuf,0,sizeof(recvbuf));
            int count = read(connt_fd,recvbuf,sizeof(recvbuf));
            if(-1 == count)
            {
                perror("read");
                return -1;
            }
            else if(0 == count)
            {
                printf("client had quit\n");
                break;
            }
            if(strncmp(recvbuf,"sl",2) == 0)
            {
                system("sl");
            }
            recvbuf[strlen(recvbuf)-1] = '\0';
            printf("%s\n",recvbuf);
        }
        close(connt_fd);
    }
    close(listen_fd);
    return 0;
}

int server_init(char* addr,int port,int max_listen_queue)//socket\bind\listen
{
    int listen_fd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == listen_fd)
    {
        perror("socket");
        return -1;
    }
    printf("socker success.\n");
    sleep(1);
    struct sockaddr_in server_addr = {
        .sin_family = AF_INET,
        .sin_port = htons(port),
        .sin_addr.s_addr = inet_addr(addr)
    };
    int opt = 1;
    int ret_setsockopt = setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
    if(-1 == ret_setsockopt)
    {
        perror("setsockopt");
        return -1;
    }
    int ret_bind = bind(listen_fd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr_in));
    if(-1 == ret_bind)
    {
        perror("bind");
        return -1;
    }
    printf("bind success.\n");
    sleep(1);
    int ret_listen = listen(listen_fd,max_listen_queue);
    if(-1 == ret_listen)
    {
        perror("listen");
        return -1;
    }
    printf("server init and start success.\n");
    printf("waiting for client connect...\n");
    return listen_fd;
}

int wait_for_client(int listen_fd)
{
    struct sockaddr_in client_addr;
#if 0
    int connt_fd = accept(listen_fd,NULL,NULL);
    if(-1 == connt_fd)
    {
        perror("accept");
    }
#endif
#if 1
    socklen_t clen = sizeof(client_addr);
    int connt_fd = accept(listen_fd,(struct sockaddr*)&client_addr,&clen);
	if(-1 == connt_fd)
    {
        perror("accept");
    }
#endif
    printf("connect success %d client.\n",connt_fd-3);
    printf("client (%s:%d) connect success.\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
    return connt_fd;
}

tcp_client.c 

#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>

#define SIZE 1024
int client_init(char* server_ip,int server_port);
int client_connect_server(int connt_fd);


int main(int argc, char *argv[])
{ 
    char sendbuf[SIZE] = {0};
    int connt_fd = client_init(argv[1],atoi(argv[2]));
//    int connt_fd = client_init("127.0.0.1",2234);
    while(1)
    {
        memset(sendbuf,0,strlen(sendbuf));
        fgets(sendbuf,sizeof(sendbuf)-1,stdin);
        write(connt_fd,sendbuf,strlen(sendbuf));
    }
    close(connt_fd);
    return 0;
}
int client_init(char* server_ip,int server_port)
{
    int connt_fd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == connt_fd)
    {
        perror("socket");
        return -1;
    }
    struct sockaddr_in server_addr = {
        .sin_family = AF_INET,
        .sin_port = htons(server_port),
        .sin_addr.s_addr = inet_addr(server_ip)
    };
    int ret_connect = connect(connt_fd,(struct sockaddr*)&server_addr,sizeof(server_addr));
    if(-1 == ret_connect)
    {
        perror("connect");
        return -1;
    }
    printf("connect to server(%s:%d) success.\n",inet_ntoa(server_addr.sin_addr),ntohs(server_addr.sin_port));
    return connt_fd;
}
#if 0
int client_connect_server(int connt_fd)
{
    int ret_connect = connect(connt_fd,(struct sockaddr*)&server_addr,sizeof(server_addr));
    if(-1 == ret_connect)
    {
        perror("connect");
        return -1;
    }
    printf("connect to server(%s:%d) success.\n",inet_ntoa(server_addr),ntohs(server_addr.sin_port));
    return ret_connect;
}
#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值