socket通信(ipv4,ipv6)

时间:2025-03-09 09:10:10

实现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/