UNIX环境编程学习笔记-----编程实例------一个简单的服务器端和客户端程序

服务器端程序:


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<sys/socket.h>
#include<arpa/inet.h>


#define MAX_LINE 100


void my_fun(char *p)
{
if(p==NULL)
return ;
for(;*p!='\0';p++)
if(*p>='A'&&*p<='Z')
*p=*p-'A'+'a';

}


int main(void)


{
struct sockaddr_in sin;
struct sockaddr_in cin;

int l_fd;
int c_fd;
socklen_t len;
char buf[MAX_LINE]; /*存储传送内容的缓冲区*/
char addr_p[INET_ADDRSTRLEN];/*存储客户端地址的缓冲区*/
int port=8000;  /*端口号使用8000*/

int n; /*读写字节数*/
bzero(&sin,sizeof(sin));/*清空地址结构*/
sin.sin_family=AF_INET;/* 使用IPV4通信域*/
sin.sin_addr.s_addr=INADDR_ANY;/*服务器可以接收任意地址*/   //这个任意地址是什么意思???
sin.sin_port=htons(port);/*端口号转换成网络字节序*/
l_fd=socket(AF_INET,SOCK_STREAM,0);/*创建套接字,使用TCP协议*/

bind(l_fd,(struct sockaddr*)&sin,sizeof(sin));/*将地址和套接字绑定*/   
listen(l_fd,10);
printf("\n");

while(1)
{
/*服务器程序多半是死循环*/
/* 接受连接请求,从此函数中返回后就可以开始通信了*/
c_fd=accept(l_fd,(struct sockaddr*)&cin,&len);
n=read(c_fd,buf,MAX_LINE);/*读取客户端传来的信息*/
inet_ntop(AF_INET,&cin.sin_addr,addr_p,sizeof(addr_p));
printf("client IP is %s \n",addr_p);
printf("client port is %d\n",ntohs(cin.sin_port));/*打印客户端的IP地址和端口号*/
printf("content is: %s\n",buf);/*打印客户端发送过来的字符串*/

my_fun(buf);/*调用大小写转换函数*/
 write(c_fd,buf,n);/*将转换后的字符串发送给客户端*/
 close(c_fd);/*通信结束,关闭套接字*/
 
 
}
return 0;/*不应该执行到这里*/



}





客户端程序:


#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<strings.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#define MAX_LINE 100


int main(int argc,char *argv[])
{
struct sockaddr_in sin;/*服务器地址*/
char buf[MAX_LINE];
int sfd;
int port=8000;
char *str="test string";/*默认的字符串*/

if(argc>1)
{
str=argv[1];/*从命令行参数中取得用户输入的串*/

}
bzero(&sin,sizeof(sin)); /*为什么有些函数需要提供缓冲区的大小信息???? */
sin.sin_family=AF_INET;/*使用IPV4地址族*/
/*和本机通信,同一台主机担任服务器和客户端角色*/
inet_pton(AF_INET,"127.0.0.1",&sin.sin_addr);
sin.sin_port=htons(port);/*端口号使用8000,必须和服务器的一致*/
sfd=socket(AF_INET,SOCK_STREAM,0);/*创建套接字*/
connect(sfd,(const struct sockaddr*)&sin,sizeof(sin));
/*主动连接服务器*/
write(sfd,str,strlen(str)+1);/*发送字符串,该串包含'\0'结束符*/
/*
读取服务器程序发回的串,由于是同一台主机通信,不存在延时问题。
*但是在真正的网络环境中,要处理读操作的延时问题。

*/
read(sfd,buf,MAX_LINE);
printf("recive from server :%s\n",buf);/*打印该串*/
close(sfd);/*关闭套接字,结束通信*/
return 0;

}





运行结果截图:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值