socket网络通信示例代码

service端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define SERVER_PORT 8888

int main(void)
{
	struct sockaddr_in server_addr = {0};
	struct sockaddr_in client_addr = {0};
	char ip_str[20] = {0};
	int sockfd, connfd;
	int addrlen = sizeof(client_addr);
	char recvbuf[512];
	int ret;
	
	/* 打开套接字,得到套接字描述符 */
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (0 > sockfd) 
	{
	    perror("socket error");
		exit(EXIT_FAILURE);
	}
	
	/* 将套接字与指定端口号进行绑定 */
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(SERVER_PORT);
	
	ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
	if (0 > ret) 
	{
		perror("bind error");
		close(sockfd);
		exit(EXIT_FAILURE);
	}
	
	/* 使服务器进入监听状态 */
	ret = listen(sockfd, 50);
	if (0 > ret) 
	{
		perror("listen error");
		close(sockfd);
		exit(EXIT_FAILURE);
	}
	
	/* 阻塞等待客户端连接 */
	connfd = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen); //返回的套接字是服务器与客户端的
	if (0 > connfd) 
	{
		perror("accept error");
		close(sockfd);
		exit(EXIT_FAILURE);
	}

	printf("有客户端接入...\n");
	inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, ip_str, sizeof(ip_str));
	printf("客户端主机的 IP 地址: %s\n", ip_str);
	printf("客户端进程的端口号: %d\n", client_addr.sin_port);
	
	/* 接收客户端发送过来的数据 */
	for ( ; ; ) 
	{
		// 接收缓冲区清零
		memset(recvbuf, 0x0, sizeof(recvbuf));
		 
		// 读数据
		ret = recv(connfd, recvbuf, sizeof(recvbuf), 0);
		if(0 >= ret) 
		{
			perror("recv error");
			close(connfd);
			break;
		}
		
		// 将读取到的数据以字符串形式打印出来
		printf("from client: %s\n", recvbuf);
		
		// 如果读取到"exit"则关闭套接字退出程序
		if (0 == strncmp("exit", recvbuf, 4)) 
		{
			printf("server exit...\n");
			close(connfd);
			break;
		}
	}
	
	/* 关闭套接字 */
	close(sockfd);
	exit(EXIT_SUCCESS);
}

client端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define SERVER_PORT 8888 //服务器的端口号
#define SERVER_IP "192.168.189.130" //服务器的IP地址

int main(void)
{
	struct sockaddr_in server_addr = {0};
	char buf[512];
	int sockfd;
	int ret;
	
	/* 打开套接字,得到套接字描述符 */
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (0 > sockfd) 
	{
		perror("socket error");
		exit(EXIT_FAILURE);
	}
	
	/* 调用 connect 连接远端服务器 */
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(SERVER_PORT); //端口号
	inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);//IP 地址
	
	ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
	if (0 > ret) 
	{
		perror("connect error");
		close(sockfd);
		exit(EXIT_FAILURE);
	}
	
	printf("服务器连接成功...\n\n");

	/* 向服务器发送数据 */
	for ( ; ; ) 
	{
		// 清理缓冲区
		memset(buf, 0x0, sizeof(buf));
		
		// 接收用户输入的字符串数据
		printf("Please enter a string: ");
		fgets(buf, sizeof(buf), stdin);
		
		// 将用户输入的数据发送给服务器
		ret = send(sockfd, buf, strlen(buf), 0);
		if(0 > ret)
		{
			perror("send error");
			break;
		}
		
		//输入了"exit",退出循环
		if(0 == strncmp(buf, "exit", 4))
			break;
	}
	
	close(sockfd);
	exit(EXIT_SUCCESS);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴子坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值