#include <myhead.h>
#define PORT 8888
#define IP "192.168.115.175"
void handler(int signo)
{
if(signo==SIGCHLD)
{
while(waitpid(-1,NULL,WNOHANG)>0);
}
}
int deal_(int newfd,struct sockaddr_in cin)
{
char buf[128]="";
while(1)
{
bzero(buf,sizeof(buf));
//读取客户端发的信息
//read(newfd,buf,sizeof(buf));
int res=recv(newfd,buf,sizeof(buf),0);
if(res==0)
{
printf("客户端已下线\n");
break;
}else if(res<0)
{
perror("error");
return -1;
}
printf("%s: %d: %s",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
//write(newfd,buf,sizeof(buf));
strcat(buf,"*_*");
send(newfd,buf,sizeof(buf),0);
}
close(newfd);
return 0;
}
int main(int argc, const char *argv[])
{
//1、创建用于接受连接的套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1)
{
perror("socket error");
return -1;
}
//设置端口号快速重用
int reuse=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
{
perror("setsockopt error");
return -1;
}
//2、绑定IP地址和端口
//2.1、填充要绑定的地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
//2.2绑定
if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
{
perror("bind error");
return -1;
}
printf("bind success\n");
//3.监听
if(listen(sfd,128)==-1)
{
perror("listen error");
return -1;
}
//4、阻塞等待客户端的链接请求
//4.1、定义客户端地址信息结构体
struct sockaddr_in cin;
cin.sin_family =AF_INET;
socklen_t socklen=sizeof(cin);
if(signal(SIGCHLD,handler)==SIG_ERR)
{
perror("signal error");
return -1;
}
pid_t pid;
while(1)
{
//4.2、阻塞客户端的连接请求,并且获取客户端的地址信息
int newfd=accept(sfd,(struct sockaddr *)&cin,&socklen);
if(newfd==-1)
{
perror("accept error");
return -1;
}
printf("accept success\n");
pid=fork();
if(pid>0)
{
close(newfd);
wait(NULL);
}else if(pid==0)
{
close(sfd);
deal_(newfd,cin);
exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
}
//6、关闭所有套接字
close(sfd);
return 0;
}
#include <myhead.h>
#define SERPORT 8888
#define SERIP "192.168.112.110"
#define CLIPORT 6666
#define CLIIP "192.168.112.110"
int main(int argc, const char *argv[])
{
//1、创建用于通信的套接字
int cfd=socket(AF_INET,SOCK_STREAM,0);
if(cfd==-1)
{
perror("socket error");
return -1;
}
//2、绑定
//2.1填充地址信息结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port=htons(CLIPORT);
cin.sin_addr.s_addr=inet_addr(CLIIP);
//2.2绑定
if(bind(cfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
{
perror("bind error");
return -1;
}
//3、连接服务器
//3.1、填充服务器地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(SERPORT);
sin.sin_addr.s_addr=inet_addr(SERIP);
if((connect(cfd,(struct sockaddr *)&sin,sizeof(sin)))==-1)
{
perror("connect error");
return -1;
}
printf("connect success\n");
//5、收发数据使用newfd完成通信
char buf[128]="";
char rbuf[128]="";
while(1)
{
bzero(buf,sizeof(buf));
bzero(rbuf,sizeof(rbuf));
//将数据发送给服务器
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
send(cfd,buf,sizeof(buf),0);
if(strcmp("quit",buf)==0)
{
break;
}
//接受服务器发的消息
int res=recv(cfd,rbuf,sizeof(rbuf),0);
if(res==0)
{
printf("客户端已关闭\n");
break;
}
printf("%s\n",rbuf);
}
//6、关闭套接字
close(cfd);
return 0;
}
buntu@ubuntu:day3$ cat 3.c
#include<myhead.h>
#define SERIP "192.168.115.143"
#define SERPORT 9999
int main(int argc, const char *argv[])
{
//1、创建用于通信的套接字
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sfd == -1)
{
perror("socket error");
return -1;
}
printf("sfd = %d\n", sfd);
//2、bind绑定端口号和ip地址
struct sockaddr_in sin;
sin.sin_family = AF_INET; //ipv4通信
sin.sin_port = htons(SERPORT); //端口号
sin.sin_addr.s_addr = inet_addr(SERIP); //ip地址
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) ==-1)
{
perror("bind error");
return -1;
}
printf("bind success\n");
//连接
struct sockaddr_in dst;
dst.sin_family = AF_INET; //ipv4通信
dst.sin_port = htons(7777); //端口号
dst.sin_addr.s_addr = inet_addr("192.168.115.164"); //ip地址
if(connect(sfd, (struct sockaddr*)&dst, sizeof(dst)) ==-1)
{
perror("dst error");
return -1;
}
printf("connect success\n");
//3、收发数据
//定义客户端结构体变量
struct sockaddr_in cin;
cin.sin_family = AF_INET;
socklen_t socklen = sizeof(cin);
char buf[128] = "";
while(1)
{
//清空内容
bzero(buf, sizeof(buf));
read(sfd, buf, sizeof(buf));//读取信息
//recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &socklen);
//链接后发回去
strcat(buf, "*_*");
//谁发给我我回给谁
//sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin));
read(sfd, buf, sizeof(buf));
dst.sin_family=AF_UNSPEC;
if(connect(sfd, (struct sockaddr*)&dst, sizeof(dst)) ==-1)
{
perror("dst error");
return -1;
}
printf("内核信息清理完毕\n");
}
//4、关闭套接字
close(sfd);
return 0;
}
#include <myhead.h>
#define PORT 8888
#define IP "192.168.115.175"
struct Info
{
int newfd;
struct sockaddr_in cin;
};
void *deal_msg_(void *arg)
{
int newfd=((struct Info *)arg)->newfd;
struct sockaddr_in cin=((struct Info *)arg)->cin;
char buf[128]="";
while(1)
{
bzero(buf,sizeof(buf));
//读取客户端发的信息
//read(newfd,buf,sizeof(buf));
int res=recv(newfd,buf,sizeof(buf),0);
if(res==0)
{
printf("客户端已下线\n");
break;
}else if(res<0)
{
perror("error");
return NULL;
}
printf("%s: %d: %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
//write(newfd,buf,sizeof(buf));
strcat(buf,"*_*");
send(newfd,buf,sizeof(buf),0);
}
close(newfd);
pthread_exit(NULL);
return 0;
}
int main(int argc, const char *argv[])
{
//1、创建用于接受连接的套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1)
{
perror("socket error");
return -1;
}
//设置端口号快速重用
int reuse=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
{
perror("setsockopt error");
return -1;
}
//2、绑定IP地址和端口
//2.1、填充要绑定的地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
//2.2绑定
if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
{
perror("bind error");
return -1;
}
printf("bind success\n");
//3.监听
if(listen(sfd,128)==-1)
{
perror("listen error");
return -1;
}
//4、阻塞等待客户端的链接请求
//4.1、定义客户端地址信息结构体
struct sockaddr_in cin;
cin.sin_family =AF_INET;
socklen_t socklen=sizeof(cin);
while(1)
{
//4.2、阻塞客户端的连接请求,并且获取客户端的地址信息
int newfd=accept(sfd,(struct sockaddr *)&cin,&socklen);
if(newfd==-1)
{
perror("accept error");
return -1;
}
printf("accept success\n");
struct Info info={newfd,cin};
pthread_t tid;
if(pthread_create(&tid,NULL,deal_msg_,&info)!=0)
{
printf("create error\n");
return -1;
}
if(pthread_detach(tid)!=0)
{
printf("detach error\n");
return -1;
}
}
//6、关闭所有套接字
close(sfd);
return 0;
}