单个服务器和客户端的通信
创建一个客户端,一个服务器。
要求:客户端传小写字母给服务器,服务器接收后转换成大写字母回传给客户端。
效果:客户端处循环输入一个字母,返回一个大写字母。(可以添加说明printf()输入为 / 转换后输出为)
/*********************************************************************
File Name: tcp_net_socket.h
Author: 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 9000
extern int tcp_init();
extern int tcp_accept(int sfd);
extern int tcp_connet();
extern void signalhandler(void);
#endif
/*********************************************************************
File Name: tcp_net_socket.c
Author: 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); //申请新的socket
if(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连接至指定的服务器网络地址 serveraddr
if(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.c
Author: 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.c
Author: 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;
}
还没有评论,来说两句吧...