服务器端程序:
#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;
}
运行结果截图: