linux 下的网络编程,linux网络编程基础--------7(纯C实现linux下socket服务器与客户...

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

1ec37dc2ddbe997123ab63be834199fd.png

linux网络编程基础--------7(纯C实现linux下socket服务器与客户相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值