Linux ---> 简单socket
发布日期:2025-04-05 18:27:16 浏览次数:7 分类:精选文章

本文共 3280 字,大约阅读时间需要 10 分钟。

服务器端代码示例

这段代码实现了一个简单的TCP服务器端程序,主要使用了socket()bind()listen()accept()函数完成监听和连接处理。以下是代码的详细说明:

  • socket()函数:创建一个IPv4地址族的TCP socket。成功返回文件描述符,失败返回-1。
  • #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    1. 端口定义与socket创建:定义了一个服务端口3333,并尝试创建socket。如果创建失败,会打印错误信息并退出程序。
    2. #define SERVPORT 3333#define BACKLOG 10int main(void) {    int sockfd;    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {        printf("socket 创建失败!");        exit(1);    }    printf("创建监听socket成功。\n");
      1. 地址配置:使用socklen_t结构体myAddr配置socket地址信息。filled my sin_zero部分以确保结构体对齐。
      2. struct sockaddr_in myAddr;myAddr.sin_family = AF_INET;myAddr.sin_port = htons(SERVPORT);myAddr.sin_addr.s_addr = INADDR_ANY;bzero(&myAddr.sin_zero, 8);
        1. 绑定socket:将创建好的socket绑定到指定的本地地址。如果绑定失败,会打印错误信息并退出程序。
        2. if (bind(sockfd, (struct sockaddr *)&myAddr, sizeof(struct sockaddr)) == -1) {    printf("bind 出错!");    exit(1);}printf("socket绑定成功。\n");
          1. 监听并接受连接:设置监听队列大小为BACKLOG(即最多10个未接受的连接请求),并进入主循环处理客户端连接。
          2. printf("服务端开始listen......\n");int lisVal = listen(sockfd, BACKLOG);printf("zhi %d", lisVal);if (lisVal == -1) {    printf("listen 出错!");    exit(1);}printf("------listen is ok----\n");while (1) {
            1. 客户端连接处理:使用accept()函数等待并接受客户端连接。如果连接成功,会打印客户端地址信息,并进入子进程处理数据传输。
            2. struct sockaddr_in remoteAddr;int clientFd;int sin_size = sizeof(struct sockaddr_in);printf("----------");if ((clientFd = accept(sockfd, (struct sockaddr *)&remoteAddr, &sin_size)) == -1) {    printf("accept erro!");    continue;}
              1. 消息传输:子进程向客户端发送消息。如果发送失败,会打印错误信息并关闭socket。
              2. if (!fork()) {    char* msg = "连接上了,来自服务端的消息。\n";    if (send(clientFd, msg, sizeof(msg), 0) == -1) {        printf("send 出错!");        close(clientFd);        exit(0);    }}close(clientFd);

                客户端连接代码示例

                这段代码实现了一个TCP客户端程序,主要使用了socket()connect()recv()函数完成连接和数据接收。以下是代码的详细说明:

                #include 
                #include
                #include
                #include
                #include
                #include
                #include
                #include
              3. 端口定义与socket创建:定义了一个服务端口3333,尝试创建一个TCP socket。如果创建失败,会打印错误信息并退出程序。
              4. #define SERPORT 3333#define MAXDATASIZE 100char* DES = "127.0.0.1"; // 目的地址int main(int argc, char* *argv) {    struct hostent *host;    int sockfd;    // 如果无需指定服务器地址,可以省略这一部分    if ((host = gethostbyname(DES)) == NULL) {        printf("gethostbyname错误!");        exit(1);    }    printf("目的地址为:%s\n", host->h_name);
                1. 配置与连接:将socket连接到指定的服务器地址。使用htons()转换端口号,servAddr结构体存储服务器地址信息。
                2. struct sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_port = htons(SERPORT);servAddr.sin_addr = *((struct in_addr *)host->h_addr);bzero(&servAddr.sin_zero, 8);if (connect(sockfd, (struct sockaddr *)&servAddr, sizeof(struct sockaddr)) == -1) {    printf("连接出错\n");    exit(1);}printf("连接成功。\n");
                  1. 数据接收与处理:接收来自服务器端的数据,存储在缓冲区buf中。如果接收失败,会打印错误信息。
                  2. int recvbytes = 0;char buf[MAXDATASIZE];if ((recvbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {    printf("接收出错!");    exit(1);}buf[recvbytes] = '\0';printf("收到信息:%s\n", buf);
                    1. 关闭socket:在程序结束时,确保正确关闭已连接的socket。
                    2. printf("结束\n");close(sockfd);return 0;}

                      总结

                      以上代码示例展示了TCP协议在服务器端和客户端的典型应用,实现了基本的连接监听和数据交互功能。无论是服务器端的listen()逻辑,还是客户端的connect()recv()逻辑,都体现了TCP协议在网络通信中的重要作用。

    上一篇:Linux -chattr -隐藏权限(附加权限)
    下一篇:linux -- ubuntu修改IP地址、网关、dns

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月29日 01时18分42秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章