TCP协议服务端和客户端的连接与通信

服务端

#include <stdio.h>
#include <errno.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//TCP服务器代码   ./xxx   port


int main(int argc, char const *argv[])
{
	//1.创建TCP套接字
	int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (tcp_socket == -1)
	{
		fprintf(stderr, "tcp socket error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//2.绑定自身的IP地址和端口
	struct sockaddr_in  host_addr;

	host_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	host_addr.sin_port   		= htons(atoi(argv[1]));			//目标端口,必须转换为网络字节序
	host_addr.sin_addr.s_addr   = htonl(INADDR_ANY);		    //目标地址  INADDR_ANY 这个宏是一个整数,所以需要使用htonl转换为网络字节序

	bind(tcp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr));

	//3.设置监听  队列最大容量是5
	listen(tcp_socket,5);

	//4.等待接受客户端的连接请求
	struct sockaddr_in  client;
	socklen_t client_len = sizeof(client);

	
	int connect_fd = accept(tcp_socket,(struct sockaddr *)&client,&client_len); //会阻塞
	char buf[128] = {0};

	//5.说明双方建立连接,此时可以接收数据
	while(1)
	{
		
		read(connect_fd,buf,sizeof(buf));
		printf("recv from [%s],data is = %s\n", inet_ntoa(client.sin_addr) ,buf);
		bzero(buf,sizeof(buf));
	}


	return 0;
}

客户端

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

#define PORT 60001     //可修改

// 运行TCP客户端可执行文件   ./xxx  服务器端口  服务器地址

int main(int argc,char *argv[])
{
	//检查参数有效性
	if (argc != 3)
	{
		fprintf(stderr, "argument is invaild ,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//1.创建TCP套接字             
	int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (tcp_socket == -1)
	{
		fprintf(stderr, "tcpp socket error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

    /*
    //2.绑定自身的IP地址和端口
	struct sockaddr_in  host_addr;

	host_addr.sin_family 		= AF_INET; 				//协议族,是固定的
	host_addr.sin_port   		= htons(PORT);			//目标端口,必须转换为网络字节序
	host_addr.sin_addr.s_addr   = htonl(INADDR_ANY);	//目标地址 已经转换为网络字节序  INADDR_ANY

	bind(tcp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr));
    */


	//3.向目标服务端发送消息,需要设置目标端口和目标地址
    struct sockaddr_in  dest_addr;
    socklen_t dest_len = sizeof(dest_addr);
	dest_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	dest_addr.sin_port   		= htons(atoi(argv[1]));			//服务器端口,必须转换为网络字节序
	dest_addr.sin_addr.s_addr   = inet_addr(argv[2]);			//服务器地址 

    //申请缓冲区
	char buf[128] = {0};

    //4.向服务端连接请求
   int temp = connect(tcp_socket, (struct sockaddr *)&dest_addr,dest_len);

   //错误处理,如果connect返回值小于0则连接请求失败
   if(temp < 0)
   {
        //输出错误原因
        fprintf(stderr, "udp socket error,errno:%d,%s\n",errno,strerror(errno));
        return -1;//失败则退出程序
   }

	//5.说明双方建立连接,此时可以发送数据
    while(1)
    {
        printf("please input:");
        scanf("%s",buf);
        
        //向服务端发送数据
        write(tcp_socket, buf,sizeof(buf));
        bzero(buf,sizeof(buf));
    }

	return 0;

}
posted @   北极甜虾哟  阅读(29)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示