linux网络编程基础--------7(纯C实现linux下socket服务器与客户
linux网络编程基础--------7(纯C实现linux下socket服务器与客户端----可接云服务器或别的主机,看最后的教程解释)
上两篇章基本对一些原理性的东西讲得7788了,所以这篇开始实战,实现一个客户端传小写字母过去,服务器自动变成大写的,原理性问题请看第五节与第六节
[var1]
其中toupper函数用于把小写转换成大写。
/* File Name: server.c */
#include
#include
#include
#include
#include
#include /* See NOTES */
#include
#include
#include
#define SERV_PORT 8888
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc,char *argv[])
{
int lfd=0,cfd=0;
int ret;
char buf[BUFSIZ];
struct sockaddr_in serv_addr;
struct sockaddr_in client_addr;
socklen_t client_addr_len;//客户端传出参数长度
//定义两结构体,一个服务端绑定监听使用,第二个跟客户端通信使用
serv_addr.sin_family=AF_INET;//这三行都是初始化服务器端的设置
serv_addr.sin_port=htons(SERV_PORT);
//htons转成具有网络字节序特性的port
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
//转换成具有网络字节序特性的ip,INADDR_ANY就是任意Ip,能通信他都会给你搞上,更智能
lfd=socket(AF_INET,SOCK_STREAM,0);
//新建文件描述符,决定要使用ipv4/ipv6,第二个参数决定要tcp/udp
if(lfd==-1){
sys_err("socket error");
}
bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
//给socket lfd套接字绑定本机ip与端口
listen(lfd,128);//设置同时建立连接的最大数
client_addr_len=sizeof(client_addr);
//此处计算addr大小,待会accept函数要用到
cfd=accept(lfd,(struct sockaddr*)&client_addr,&client_addr_len);
//这里第二个参数是传出参数,传出的是客户端的ip+port
//第三个是传入跟传出,传入的是addr的大小,出:客户端addr的实际大小
if(cfd==-1)
{
sys_err("socket error for coonect");
}
//下面是write跟read
while (1)
{
ret=read(cfd,buf,sizeof(buf));
write(STDOUT_FILENO,buf,ret);
//把读到到数据先输出,确认接收信息无误
for(int i=0;i
{
buf[i]=toupper(buf[i]);
//转换成大写字母
}
write(cfd,buf,ret);
//发送转换后的字母给客户端
}
close(lfd);
close(cfd);
return 0;
}
[var1]
/* File Name: client.c */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SERV_PORT 8888
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc,char *argv[])
{
int cfd;
int conter=5;//发送hello的次数
char buf[BUFSIZ];
struct sockaddr_in serv_addr;//服务器地址结构
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr.s_addr);
//这里需要把本地字节序转换成网络字节序,具体详解此函数请看第5节
//第三个值是传出参数,所以我们可以看到实际这个函数作用就是给serv_addr.sin_addr.s_addr赋值
cfd=socket(AF_INET,SOCK_STREAM,0);
if(cfd==-1)
{
sys_err("socket error");
}
int ret=connect(cfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
if(ret!=0)
{
sys_err("socket error");
}
while(--conter){
write(cfd,"hello",5);
ret=read(cfd,buf,sizeof(buf));
write(STDOUT_FILENO,buf,ret);
sleep(1);
}
close(cfd);
return 0;
}
以上是本地客户端的实现,当然如果你要把服务器挂到你的服务器上也可以,只需要修改client客户端,的这一条语句,这个127.0.0.1改成公网ip就可
inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr.s_addr);
改成服务器绑定的公网ip地址,然后,切记云服务器打开TCP 8888端口,PC电脑关闭防火墙或新建8888入站规则就可以,很人性化很nice
linux网络编程基础--------7(纯C实现linux下socket服务器与客户相关教程