服务器:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <ctype.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void){
char buf[128];
struct sockaddr_in serv,clie;//IPV4地址家族
socklen_t cli_l;
int cfd;
int i = 0;
char ip[32];
//创建socket
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1){
perror("socket");
return -1;
}
//初始化local的ip地址和端口号
serv.sin_family=AF_INET;
serv.sin_port=htons(6066);
//INADDR_ANY代表本机所有的IP地址
serv.sin_addr.s_addr=htonl(INADDR_ANY);
//serv.sin_addr.s_addr=inet_addr("172.16.0.31"); //用这个可以直接绑定服务器的ip地址
//将sfd和本地的ip地址和端口号绑定
int b=bind(sfd,(struct sockaddr *)&serv,sizeof(serv));
if(b==-1){
perror("bind");
return -1;
}
//监听sfd客户端连接的到来,将到来的连接放到未决连接队列中
listen(sfd,5);
while(1){
cli_l=sizeof(clie);
//从未决连接队列中取出第一个,进行处理
cfd=accept(sfd,(struct sockaddr *)&clie,&cli_l);
if(cfd==-1){
perror("accept");
return -1;
}
//将ip地址从binary--->text
printf("%s\n",inet_ntop(AF_INET,&clie.sin_addr,ip,32));
//三次握手成功了
//获取客户端的消息
int r=read(cfd,buf,128);
printf("recv_buf:%s\n", buf);
//处理客户端的消息,将客户端传递过来的字符串转换为大写
for(i=0;i<r;i++)
buf[i]=toupper(buf[i]);
//响应客户端
write(cfd,buf,r);
//关闭cfd
close(cfd);
}
return 0;
}
客户端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,char *argv[]){
char buf[128];
struct sockaddr_in serv;
char *msg="it is raining...\n";
//创建socket
int fd=socket(AF_INET,SOCK_STREAM,0);
if(fd==-1){
perror("socket");
return -1;
}
//初始化服务器的ip地址和端口号
serv.sin_family=AF_INET;
serv.sin_port=htons(6066);
//服务器的ip地址 127.0.0.1 text-->binary
inet_pton(AF_INET,argv[1],&serv.sin_addr);
//向服务器发起连接
int c=connect(fd,(struct sockaddr *)&serv,sizeof(serv));
if(c==-1){
perror("connect");
return c;
}
//向服务器发送消息
write(fd,msg,strlen(msg));
//接收服务器的响应消息
int r=read(fd,buf,128);
//将接收的消息输出到显示器
write(1,buf,r);
//关闭描述符
close(fd);
return 0;
}