socket编程ipv6版本

本文介绍了一个基于IPv6的简单服务端与客户端通信程序实现。服务端使用端口8888监听并接收客户端连接请求,客户端连接到服务端后发送消息,并接收服务端返回的大写转换后的消息。

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

服务端(server.c)

#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
#include <ctype.h>



#define SERVER_IPV6 "::1"
#define SERVER_PORT 8888

#define SERVER_R_BUFF_SIZE 1024


int prepare_server_sock(unsigned char *ip, int port)
{
    int sock = socket(AF_INET6, SOCK_STREAM, 0);
    int tmp = 1;
    
    struct sockaddr_in6 server_sock;
    server_sock.sin6_family = AF_INET6;
    server_sock.sin6_port = htons(port);
    //inet_pton(AF_INET6, ip, server_sock.sin6_addr.s6_addr);
    server_sock.sin6_addr = in6addr_any;		//本地任意IPV6地址
    
    setsockopt(sock,SOL_SOCKET, SO_REUSEADDR, (const void *)&tmp, sizeof(tmp));//端口复用
    bind(sock, (struct sockaddr *)&server_sock, sizeof(struct sockaddr_in6));
    listen(sock, 128);
    
    return sock;
}


int main()
{
    int server_socket = prepare_server_sock(SERVER_IPV6, SERVER_PORT);
    if(server_socket < 0){
        printf("perpare_server_sock return error!\n");
        return 0;
    }
    
    struct sockaddr_in6 client_addr = {0};
    int client_addr_len = sizeof(struct sockaddr_in6);
    printf("waitting connet!\n");
    int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len);
    printf("new client(ip: %s, port: %d)!\n", client_addr.sin6_addr.s6_addr, htons(client_addr.sin6_port));
    if(client_socket < 0){
        printf("accept return error!\n");
        return 0;
    }
    
    char buff[SERVER_R_BUFF_SIZE] = {0};
    int n_read = 0;
    int i = 0;
    do{
        n_read = read(client_socket, buff, SERVER_R_BUFF_SIZE);
        if(n_read < 0){
            printf("reaad failed!\n");
            return 0;
        }
        else if(n_read == 0){
            close(client_socket);
            return 0;
        }
        else{
            printf("READ: %s\n", buff);
            for(i = 0; i < n_read; ++i){
                *(buff+i) = toupper(*(buff+i));
            }
            write(client_socket, buff, strlen(buff));
            printf("WRITE: %s\n", buff);
            
            memset(buff, 0x00, SERVER_R_BUFF_SIZE);
        }
    }while(n_read >= 0);
    
    return 0;
}

客户端(client.c)

#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
#include <ctype.h>
#include <sys/errno.h>



#define SERVER_IPV6 "::1"
#define SERVER_PORT 8888

#define SERVER_R_BUFF_SIZE 1024



int main()
{
    int sock = socket(AF_INET6, SOCK_STREAM, 0);
    
    struct sockaddr_in6 server_addr = {0};
    server_addr.sin6_family = AF_INET6;
    server_addr.sin6_port = htons(SERVER_PORT);
    //inet_pton(AF_INET6, SERVER_IPV6, server_addr.sin6_addr.s6_addr);
    //server_addr.sin6_addr = in6addr_loopback;	//本地回环IPV6地址
    server_addr.sin6_addr = in6addr_any;		//本地任意IPV6地址
    
    printf("connect to server!\n");
    int ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in6));
    if(ret < 0){
        printf("connect failed! errno: %d\n", errno);
        return 0;
    }
    printf("connect OK!\n");
    
    char buff[SERVER_R_BUFF_SIZE] = {0};
    while(1){
        fgets(buff, SERVER_R_BUFF_SIZE-1, stdin);
        *(buff+strlen(buff)-1) = '\0';
        
        printf("WRITE: %s\n", buff);
        write(sock, buff, strlen(buff));
        
        read(sock, buff, SERVER_R_BUFF_SIZE-1);
        printf("READ: %s\n", buff);
        
        memset(buff, 0x00, SERVER_R_BUFF_SIZE);
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值