Linux系统编程——TCP客户端

Linux系统编程------TCP客户端

客户端流程

  1. 创建流式套接字,通过socket创建
  2. 填充服务器的网络信息结构体 ------ struct sockaddr_in
  3. 与服务器建立连接,通过connect实现
  4. 收发数据------recv/send
  5. 关闭套接字------close

connect函数

c 复制代码
int connect(int sockfd, const struct sockaddr*, socklen_t addrlen);

所需头文件:sys/socket.h

sockfd:客户端的sock套接字

addr:目标服务器的地址结构体

addrlen:地址结构体的长度

返回值:成功返回0,失败返回-1并重置错误码。

实例:TCP客户端

代码:

c 复制代码
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdbool.h>

int main(int argc, char** argv) {
    //创建流式套接字
    int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
        if (sock_fd == -1) {
            perror("创建socket失败");
                return -1;
        }

        //配置服务器地址信息
    struct sockaddr_in server_info = {0};

        //IPV协议簇
        server_info.sin_family = AF_INET;

        //端口号
    server_info.sin_port = htons(8888);

        //ip地址
    server_info.sin_addr.s_addr = inet_addr("192.168.203.141");

        //连接服务器
        int ret = connect(sock_fd, (const struct sockaddr*)&server_info, sizeof(server_info));

    if (ret == -1 ) {
           perror("连接失败");
           return -1;
        }

    char buf[128] = {0};
        while(true) {
            memset(buf, 0, sizeof(buf));
                //从键盘中读取输入
            fgets(buf, sizeof(buf), stdin);
                int nbytes = send(sock_fd, buf, sizeof(buf), 0);

                if (nbytes == -1 ) {
                   perror("发送失败");
                   return -1;
                }

                //接收数据
            memset(buf, 0, sizeof(buf));
                int nbytes_recv = recv(sock_fd, buf, sizeof(buf), 0);

                if (nbytes_recv == -1) {
                   perror("读取失败");
                   return -1;
                } else if(nbytes_recv == 0) {
                   printf("服务端关闭连接,退出程序\n");
                   return 0;
                }

                printf("服务器发来的数据:%s\n",buf);
        }

    return 0;
}

```
运行结果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1b6fd9616203489d8754993468d946cd.png)
相关推荐
jiuri_12154 分钟前
Linux 服务器 Codex + DeepSeek 配置
linux·运维·服务器
__Witheart__4 分钟前
关于 uname 查看的内核版本号的后缀
android·linux·ubuntu·rockchip
爱吃生蚝的于勒9 分钟前
QT开发第三章——常用控件
linux·服务器·开发语言·前端·javascript·c++·qt
Tairitsu_H24 分钟前
告别默认Vim:Linux下轻松配置Vim开发环境
linux·编辑器·vim·配置
凯丨27 分钟前
MCP Server 教程:从零构建一个自定义工具服务器(2026 最新)
运维·服务器
极客先躯28 分钟前
高级java每日一道面试题-2026年02月08日-实战篇[Docker]-如何实现容器的快照和恢复?
java·运维·docker·容器·备份·持久化·恢复
AI服务老曹32 分钟前
打破品牌壁垒:基于 Docker 的国标 GB28181 与 RTSP 异构视频流统一接入平台架构设计(可源码交付)
运维·docker·容器
潜创微科技32 分钟前
ITE IT920X 4K60 HDMI+USB over IP 远距离传输与视频墙单芯片方案
网络协议·tcp/ip·音视频
wuminyu41 分钟前
Java锁膨胀机制之偏向锁到轻量级锁源码剖析
java·linux·c语言·jvm·c++
xhtdj41 分钟前
技术采用曲线回望二十年
运维·数据库·人工智能·clickhouse·动态规划