服务端(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;
}