实现socket通信,IPV4地址与IPV6地址。
服务端:
#include <sys/>
#include <sys/>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <netinet/>
#define PORT 4321 //端口号
#define BUFFER_SIZE 1024 //数据缓冲区的大小
#define MAX_QUE_CONN_NM 5 //请求队列的请求数
int main()
{
char *ip = "::1";
char *t = strchr(ip, ':');
//ipv4
if (t == NULL)
{
struct sockaddr_in server_sockaddr;
struct sockaddr_in client_sockaddr;
int sin_size; //地址长度,用于accept()
int recvbytes; //实际接受到的字节数,用于recv()
int sockfd; //套接字,用于socket()
int client_fd; //套接字,用于accept()
char buf[BUFFER_SIZE]; //缓冲池
/*建立socket连接*/
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
printf("Socket id = %d\n", sockfd);
bzero(&server_sockaddr, sizeof(server_sockaddr));
/*设置sockaddr_in结构体中相关参数*/
server_sockaddr.sin_family = AF_INET; //协议簇IPv4
server_sockaddr.sin_port = htons(PORT); //端口号
server_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//inet_pton(AF_INET, "127.0.0.1", &server_sockaddr.sin_addr.s_addr); //用于绑定一个固定的IP
//bind()
if (bind(sockfd, (struct sockaddr *)(&server_sockaddr), sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
printf("Bind success!\n");
//listen()
if (listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen");
exit(1);
}
printf("Listening.....\n");
while (1)
{
/*调用accept()函数,等待客户端的连接*/
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)
{
perror("accept");
exit(1);
}
memset(buf, 0, sizeof(buf));
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
printf("Received a message:%s\n", buf);
}
close(sockfd);
}
//ipv6
else
{
struct sockaddr_in6 server_sockaddr;
struct sockaddr_in6 client_sockaddr;
int sin_size; //地址长度,用于accept()
int recvbytes; //实际接受到的字节数,用于recv()
int sockfd; //套接字,用于socket()
int client_fd; //套接字,用于accept()
char buf[BUFFER_SIZE]; //缓冲池
//socket
if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
printf("Socket id = %d\n", sockfd);
bzero(&server_sockaddr, sizeof(server_sockaddr));
/*设置sockaddr_in结构体中相关参数*/
server_sockaddr.sin6_family = AF_INET6; //协议簇IPv6
server_sockaddr.sin6_port = htons(PORT); //端口号
inet_pton(AF_INET6, "::1", &server_sockaddr.sin6_addr); //用于绑定一个固定的IP
//bind()
if (bind(sockfd, (struct sockaddr *)(&server_sockaddr), sizeof(server_sockaddr)) == -1)
{
perror("bind");
exit(1);
}
printf("Bind success!\n");
//listen()
if (listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen");
exit(1);
}
printf("Listening.....\n");
while (1)
{
/*调用accept()函数,等待客户端的连接*/
sin_size = sizeof(struct sockaddr_in6);
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)
{
perror("accept");
exit(1);
}
memset(buf, 0, sizeof(buf));
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
printf("Received a message:%s\n", buf);
}
close(sockfd);
}
return 0;
}
客户端:
#include <sys/>
#include <sys/>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <netinet/>
#define PORT 4321 //端口号
#define BUFFER_SIZE 1024 //缓冲区大小
int main(int argc,char *argv[])
{
if (argc < 3)
{
fprintf(stderr, "USAGE:./client Hostname(or ip address) TEXT\n");
exit(1);
}
char *ip = argv[1];
char *t = strchr(ip, ':');
//ipv4
if (t == NULL)
{
int sockfd; //套接字描述符
int sendbytes; //实际发送的字节数,用于send()
char buf[BUFFER_SIZE]; //缓冲池
struct hostent *host; //host类型指针,用于存放将主机名转化成的
struct sockaddr_in server_addr; //结构体
//socket()
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
printf("socket created/n");
bzero(&server_addr, sizeof(server_addr));
/*设置sockaddr_in结构体中相关参数*/
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
//connect()
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
perror("connect");
exit(1);
}
memset(buf, 0, sizeof(buf));
sprintf(buf, "%s", argv[2]);
//send()
if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
{
perror("send");
exit(1);
}
close(sockfd);
}
//ipv6
else
{
int sockfd; //套接字描述符
int sendbytes; //实际发送的字节数,用于send()
char buf[BUFFER_SIZE]; //缓冲池
struct hostent *host; //host类型指针,用于存放将主机名转化成的
struct sockaddr_in6 server_addr; //结构体
//socket()
if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
bzero(&server_addr, sizeof(server_addr));
server_addr.sin6_family = AF_INET6;
server_addr.sin6_port = htons(PORT);
inet_pton(AF_INET6, argv[1], &server_addr.sin6_addr);
//connect
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
perror("connect");
exit(1);
}
memset(buf, 0, sizeof(buf));
sprintf(buf, "%s", argv[2]); //将参数2放进缓冲区中
/*将缓冲区中的数据发送给服务器*/
if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
{
perror("send");
exit(1);
}
close(sockfd);
}
return 0;
}
编译:gcc -o server
gcc -o client
执行结果:
./client ::1 helloworld
[admin@one tmp]$ ./server
Socket id = 3
Bind success!
Listening.....
Received a message:helloworld
参考:
/wuyuxuan/p/