socket学习记录

socket学习记录

/*tcp_server.c
*服务器编程流程:
* 1.创建socket                                     ---->   socket()
* 2. 绑定IP和端口号                                ---->   bind()
* 3. 设定最大连接数                                ---->   listen()
* 4. 阻塞监听客户端连接                            ---->   accept()
    (会返回新的文件描述符,用于与客户端通信)    
* 5. 使用完毕后,关闭socket						   ---->   close()
*     (此程序用于演示流程,把close写在while外面,实际上没有关闭) 
*	
* 至此,前面执行成功的话,服务器就建立好了,后面就可以读写信息了
*以下示例程序实现:
*①将客户端的IP地址和端口号打印出来;
*②服务器将接收到的数据打印到屏幕;
*③服务器将接收到的小写字母转换成大写字母返回给客户端


*/


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

#define SERV_PORT 9527  
#define BUFFSIZE 1024

int main(void)
{
	int lfd, cfd, res;
	
	char buff[BUFFSIZE], client_ip[1024];                                          
	struct sockaddr_in serv_addr, client_addr;                 //查看结构体 man 7 ip
	socklen_t client_addr_len;

	//打开一个网络通讯端口,返回文件描述符,后续与服务器建立连接使用
	lfd = socket(AF_INET, SOCK_STREAM, 0);
	if (lfd == -1)
	{
		printf("socket error!");
	}
	
	serv_addr.sin_family = AF_INET;                       //AF_INET        IPv4协议
	serv_addr.sin_port = htons(SERV_PORT);                //htons把无符号短整形主机字节顺序转变为网络字节顺序,实际上就是将计算机的小端格式转为网络字节序的大端格式
														  //此处为端口号,使用man htons查看详情
	serv_addr.sin_addr.s_addr =htonl(INADDR_ANY);		  //INADDR_ANY宏表示本地的任意IP地址

	res = bind(lfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr));
	if(res == -1)
	{
		printf("bind error!");
	}

	listen(lfd, 128);     //128为最大上限数
	client_addr_len = sizeof(client_addr);    
	cfd = accept(lfd, (struct sockaddr*)&client_addr, &client_addr_len);                 //阻塞监听客户端连接
	if(cfd == -1)
	{
		printf("accept error!");
	}
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");	
	printf("client ip:%s       port:%d\n",inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip)),
			ntohs(client_addr.sin_port));
	printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>\n");


	//如果建立连接成功,则开始进入数据处理(用户自定义)
	while(1)
	{
		res = read(cfd, buff, sizeof(buff));
		write(STDOUT_FILENO, buff, res);   //写到屏幕上
	
		for (int i =0; i< res; i++)
		{
			buff[i] = toupper(buff[i]);        //转换成大写再写回buff
		}
	
		write(cfd, buff, res);            //写res个到buf中
	}
	close(lfd);
	close(cfd);
}

/*tcp_client.c
*客户端编程流程:
* 1.创建socket                                     ---->   socket()
* 2. 与服务器建立连接                              ---->   connect()
* 3. 使用完毕后,关闭socket						   ---->   close()
*     (此程序用于演示流程,把close写在while外面,实际上没有关闭) 
*  
* 至此,前面执行成功的话,客户端与服务器就建立好了,后面就可以读写信息了
*以下示例程序实现:
*	发送小写hello到服务器,服务器接收到后转为大写,发回给客户端,客户端接收并打印到屏幕上
*/


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

#define SERV_PORT 9527  
#define BUFFSIZE 1024
#define SEVER_IP "172.21.94.59"          //填写你自己服务器绑定的IP地址,ifconfig查看
#define SERVER_PORT 9527                 //服务器绑定的端口号

int main(void)
{
	int sockfd;
	int i, n;
	char *str="hello\n";
	char rec_buf[BUFFSIZE];
	
	struct sockaddr_in servaddr;
	
	/* char buff[BUFFSIZE], client_ip[1024];    */                                       
/* 	struct sockaddr_in serv_addr, client_addr;                 //查看结构体 man 7 ip
	socklen_t client_addr_len; */

	//打开一个网络通讯端口,返回文件描述符,后续与服务器建立连接使用
	sockfd = socket(AF_INET, SOCK_STREAM, 0);                     //IPV4    TCP
	if (sockfd == -1)
	{
		printf("socket error!");
	}
	
	servaddr.sin_family = AF_INET;
	inet_pton(AF_INET, SEVER_IP, &servaddr.sin_addr);      //将IP转换后放入servaddr.sin_addr中
	servaddr.sin_port = htons(SERVER_PORT);               //转换端口
	
	connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
	
	while(1)
	{
		
		//printf("client is wiitting!\n");
		write(sockfd, str, strlen(str));
		n = read(sockfd, rec_buf, BUFFSIZE);
		write(STDOUT_FILENO, rec_buf, n);
	
	}	
	
	close(sockfd);
		
	
}

上一篇:计算机网络(三) --网络编程基础Socket


下一篇:Linux——如何清除buff/cache