单个服务器和客户端的通信

来源:互联网 发布:天通银交易软件 编辑:程序博客网 时间:2024/05/01 21:38
创建一个客户端,一个服务器。
要求:客户端传小写字母给服务器,服务器接收后转换成大写字母回传给客户端。

效果:客户端处循环输入一个字母,返回一个大写字母。(可以添加说明printf()输入为 / 转换后输出为)

/*********************************************************************File Name:               tcp_net_socket.hAuthor:                           date:Description:            Fuction List:********************************************************************/#ifndef _TCP_NET_SOCKET_H#define _TCP_NET_SOCKET_H#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <stdlib.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <signal.h>#define SERV_PORT 9000extern int tcp_init();extern int tcp_accept(int sfd);extern int tcp_connet();extern void signalhandler(void);#endif
/*********************************************************************File Name:               tcp_net_socket.cAuthor:                            date:Description:            Fuction List:int tcp_init() //用于初始化操作int tcp_accept(int sfd)//用于服务器的接收int tcp_connect(const char* ip)//用于客户端的连接void signalhandler(void)//用于信号处理,让服务器在按下Ctrl+c或Ctrl+\时不会退出********************************************************************/#include "tcp_net_socket.h"//用于初始化操作int tcp_init()  {int sfd = socket(AF_INET, SOCK_STREAM, 0);     //创建套接字if(sfd == -1){perror("socket");return -1;}int ret;struct sockaddr_in serveraddr;memset(&serveraddr,0,sizeof(struct sockaddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(SERV_PORT);serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);ret = bind(sfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr));if(ret == -1){perror("bind");return -1;}ret = listen(sfd,10);           //监听它,并设置允许最大的连接数为10个if(ret == -1){perror("listen");close(sfd);return -1;}return sfd;}//用于服务器的接收int tcp_accept(int sfd){struct sockaddr_in clientaddr;memset(&clientaddr, 0, sizeof(struct sockaddr));int addrlen = sizeof(struct sockaddr);//sfd接受客户端的连接,并创建新的socket为new_fd,将请求连接的客户端的ip、port保存在结构体clientaddr中int new_fd = accept(sfd, (struct sockaddr*)&clientaddr, &addrlen);       if(new_fd == -1){perror("accept");close(sfd);return -1;}printf("%s %d success connet...\n", inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));return new_fd;}//用于客户端的连接int tcp_connect(const char* ip){int ret;int sfd = socket(AF_INET, SOCK_STREAM, 0);     //申请新的socketif(sfd == -1){perror("socket");return -1;}struct sockaddr_in serveraddr;memset(&serveraddr, 0,sizeof(struct sockaddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(SERV_PORT);serveraddr.sin_addr.s_addr = inet_addr(ip);    ret = connect(sfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr));       //将sfd连接至指定的服务器网络地址 serveraddrif(ret == -1){perror("connect");close(sfd);return -1;}return sfd;}//用于信号处理,让服务器在按下Ctrl+c或Ctrl+\时不会退出void signalhandler(void){sigset_t sigSet;sigemptyset(&sigSet);sigaddset(&sigSet,SIGINT);sigaddset(&sigSet,SIGQUIT);sigprocmask(SIG_BLOCK,&sigSet,NULL);}
/*********************************************************************File Name:               tcp_net_server.cAuthor:                  xxx        date:Description:            Fuction List:********************************************************************/#include "tcp_net_socket.h"int main(){signalhandler();int sfd = tcp_init();int ret;while(1){int cfd = tcp_accept(sfd);char buf;ret = read(cfd, &buf, sizeof(buf));if(ret == -1){perror("read");close(cfd);close(sfd);return -1;}buf = buf - 'a' + 'A';ret = write(cfd, &buf, 1);if(ret == -1){perror("write");close(cfd);close(sfd);return -1;}close(cfd);}close(sfd);return 0;}

/*********************************************************************File Name:               tcp_net_client.cAuthor:                  xxx       date:Description:            Fuction List:********************************************************************/#include "tcp_net_socket.h"int main(int argc, char** argv){if(argc != 2){printf("Usage:./client ip\n");return -1;}int ret;char buf[2] = {0};while(1){int sfd = tcp_connect(argv[1]);memset(&buf,0,sizeof(buf));printf("请输入小写字母:");scanf("%s",&buf);ret = write(sfd, &buf[0], 1);if(ret == -1){perror("write");return -1;}ret = read(sfd, &buf[0], sizeof(char));if(ret == -1){perror("read");return -1;}printf("转换后的大写字母为:");printf("%c\n",buf[0]);close(sfd);}return 0;}




0 0
原创粉丝点击