搭建TCP协议服务器和客户端

/*server.c*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>  
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <ctype.h>

#define N 64
#define SERV_PORT 6666  //设置端口号
#define SERV_IP "0"     //设置服务器的IP

int main(int argc, char *argv[])
{
	int listenfd;       //用于保存监听套接字
	int connfd;         //用于保存通信的套接字
	char buf[N] = {0};  //用于保存客户端发来的信息
	//1、创建套接字
	listenfd = socket(AF_INET,SOCK_STREAM,0);
	if(-1 == listenfd)
	{
		perror("socket");
		return -1;
	}
	printf("socket %d ok!\n",listenfd);
	//填充ip等信息到通用ip结构体
	struct sockaddr_in saddr = {
		.sin_family      = AF_INET,
		.sin_port        = htons(SERV_PORT),
		.sin_addr.s_addr = inet_addr(SERV_IP)
	};
	//设置套接字属性、端口重用   setsockopt();
	int opt = 1;
	setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
	//2、绑定ip和端口
	int ret1 = bind(listenfd,(struct sockaddr *)&saddr,sizeof(saddr));
	if(-1 == ret1)
	{
		perror("bind");
		return -1;
	}
	printf("bind ok!\n");
	//3、监听
	int ret2 = listen(listenfd,8);
	if(-1 == ret2)
	{
		perror("listen");
		return -1;
	}
	printf("waiting for connection...");
	//循环监听客户端
	while(1)
	{
		//4、处理客户端请求
		struct sockaddr_in caddr = {0};
		socklen_t clen = sizeof(caddr);
		connfd = accept(listenfd,(struct sockaddr *)&caddr,&clen);
		if(-1 == connfd)
		{
			perror("accept");
			return -1;
		}
		printf("client(%s: %d)\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
		//5、通信
		while(1)
		{
			memset(buf,0,sizeof(buf));
			int ret3 = recv(connfd,buf,sizeof(buf),0);
			if(-1 == ret3)
			{
				perror("read");
				return -1;
			}
			else if(0 == ret3)
			{
				printf("client quit\n");
				break;
			}
			printf("recv: %s",buf);
		}
		//6、关闭套接字
		close(connfd);
	}
	close(listenfd);
	return 0;
}
/*client.c*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>

#define N 64
#define SERV_PORT 6666  //设置端口号
#define SERV_IP "0"     //设置服务器的IP

int main(int argc, char *argv[])
{
	int sockfd;
	char buf[N] = {0};
	//1、创建套接字
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(-1 == sockfd)
	{
		perror("socket");
		return -1;
	}
	printf("socket %d ok!\n",sockfd);
	//填充ip等信息到通用ip结构体
	struct sockaddr_in saddr = {
		.sin_family      = AF_INET,
		.sin_port        = htons(SERV_PORT),
		.sin_addr.s_addr = inet_addr(SERV_IP)
	};
	//2、连接服务器
	int ret =  connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
	if(-1 == ret)
	{
		perror("connect");
		return -1;
	}
	printf("connect ok!\n");
	//3、通信
	while(1)
	{
		printf("send: ");
		fgets(buf,sizeof(buf)-1,stdin);
		send(sockfd,buf,strlen(buf),0);
	}
	//4、关闭通信
	close(sockfd);
	return 0;
}

 

猜你喜欢

转载自blog.csdn.net/qq_72714790/article/details/126517445