多进程并发服务器
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
#define PORT 8888
#define IP "192.168.114.74"
void handler(int signum){
while(waitpid(-1,NULL,WNOHANG)>0);
}
int main(int argc, const char *argv[])
{
//用信号杀死僵尸进程
if(signal(SIGCHLD,handler) == SIG_ERR){
ERR_MSG("signal");
return -1;
}
//创建流式套接字 socket
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1){
ERR_MSG("socket");
return -1;
}
printf("socket success\n");
//允许端口快速重用
int reusu = 1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reusu,sizeof(reusu)) == -1){
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速重用\n");
//定义一个地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
//绑定服务器的ip和端口 bind
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){
ERR_MSG("bind");
return -1;
}
printf("bind success\n");
//将套接字设为被动监听状态 listen
if(listen(sfd,128) == -1){
ERR_MSG("listen");
return -1;
}
printf("listen success\n");
struct sockaddr_in cin;
socklen_t addrlen=sizeof(cin);
pid_t pid; //定义进程
while(1){
//获取连接成功后的套接字 accept
int newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
if(newfd == -1){
ERR_MSG("accept");
return -1;
}
printf("连接成功 newfd=%d\n",newfd);
pid=fork();
if(pid == 0){
close(sfd);
char buf[128]="";
while(1){
//清空buf
bzero(buf,sizeof(buf));
//接收客户端信息 recv
int res = recv(newfd,buf,sizeof(buf),0);
if(res == -1){
ERR_MSG("recv");
return -1;
}
else if(res == 0){
printf("用户下线 newfd=%d\n",newfd);
break;
}
printf("%s\n",buf);
strcat(buf,"*-*");
//发送信息给客户端 send
send(newfd,buf,sizeof(buf),0);
printf("send success\n");
}
exit(0);
}
close(newfd);
}
//关闭套接字 close
close(sfd);
return 0;
}
多线程并发服务器
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
#define PORT 8888
#define IP "192.168.114.74"
//线程体函数
void *task(void *arg){
int newfd=*(int *)arg;
char buf[128]="";
while(1){
//清空buf
bzero(buf,sizeof(buf));
//接收客户端信息 recv
int res = recv(newfd,buf,sizeof(buf),0);
if(res == -1){
ERR_MSG("recv");
return NULL;
}
else if(res == 0){
printf("用户下线 newfd=%d\n",newfd);
break;
}
printf("%s\n",buf);
strcat(buf,"*-*");
//发送信息给客户端 send
send(newfd,buf,sizeof(buf),0);
printf("send success\n");
}
close(newfd);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建流式套接字 socket
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1){
ERR_MSG("socket");
return -1;
}
printf("socket success\n");
//允许端口快速重用
int reusu = 1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reusu,sizeof(reusu)) == -1){
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速重用\n");
//定义一个地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
//绑定服务器的ip和端口 bind
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){
ERR_MSG("bind");
return -1;
}
printf("bind success\n");
//将套接字设为被动监听状态 listen
if(listen(sfd,128) == -1){
ERR_MSG("listen");
return -1;
}
printf("listen success\n");
struct sockaddr_in cin;
socklen_t addrlen=sizeof(cin);
pthread_t tid; //定义线程
while(1){
//获取连接成功后的套接字 accept
int newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
if(newfd == -1){
ERR_MSG("accept");
return -1;
}
printf("连接成功 newfd=%d\n",newfd);
if(pthread_create(&tid,NULL,task,&newfd)){
ERR_MSG("pthread_create");
return -1;
}
pthread_detach(tid);
}
//关闭套接字 close
close(sfd);
return 0;
}
广播接收方
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
#define PORT 8888
#define IP "192.168.114.255"
int main(int argc, const char *argv[])
{
//创建报式套接字 socket
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd == -1){
ERR_MSG("socket");
return -1;
}
printf("socket success\n");
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
//将套接字绑定服务器 bind
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){
ERR_MSG("bind");
return -1;
}
printf("bind asuccess\n");
char buf[128]="";
struct sockaddr_in cin;
socklen_t addrlen=sizeof(cin);
while(1){
bzero(buf,sizeof(buf));
//接收数据
if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen) == -1){
ERR_MSG("recvfrom");
return -1;
}
printf("收到:%s\n",buf);
}
//关闭文件描述符
close(sfd);
return 0;
}
广播发送方
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
#define PORT 8888
#define IP "192.168.114.255"
int main(int argc, const char *argv[])
{
//创建报式套接字 socket
int cfd=socket(AF_INET,SOCK_DGRAM,0);
if(cfd == -1){
ERR_MSG("socket");
return -1;
}
printf("socket success\n");
//允许广播
int board=1;
if(setsockopt(cfd,SOL_SOCKET,SO_BROADCAST,&board,sizeof(board)) == -1){
ERR_MSG("setsockopt");
return -1;
}
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
struct sockaddr_in cin;
socklen_t addrlen=sizeof(cin);
char buf[128]="";
while(1){
bzero(buf,sizeof(buf));
//发送数据
printf("请输入:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
if(sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&sin,sizeof(sin)) == -1){
ERR_MSG("sendto");
return -1;
}
printf("send success\n");
}
//关闭文件描述符
close(cfd);
return 0;
}
组播接收方
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
#define PORT 8888
#define GRP_IP "224.1.2.3"
#define IP "192.168.114.74"
int main(int argc, const char *argv[])
{
//创建报式套接字 socket
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd == -1){
ERR_MSG("socket");
return -1;
}
printf("socket success\n");
struct ip_mreqn mq;
mq.imr_multiaddr.s_addr = inet_addr(GRP_IP);
mq.imr_address.s_addr = inet_addr(IP);
mq.imr_ifindex = 2;
if(setsockopt(sfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mq,sizeof(mq)) == -1){
ERR_MSG("setsockopt");
return -1;
}
printf("进组成功\n");
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
//将套接字绑定服务器 bind
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){
ERR_MSG("bind");
return -1;
}
printf("bind asuccess\n");
char buf[128]="";
struct sockaddr_in cin;
socklen_t addrlen=sizeof(cin);
while(1){
bzero(buf,sizeof(buf));
//接收数据
if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen) == -1){
ERR_MSG("recvfrom");
return -1;
}
printf("收到:%s\n",buf);
}
//关闭文件描述符
close(sfd);
return 0;
}
组播发送方
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
#define PORT 8888
#define IP "192.168.114.74"
int main(int argc, const char *argv[])
{
//创建报式套接字 socket
int cfd=socket(AF_INET,SOCK_DGRAM,0);
if(cfd == -1){
ERR_MSG("socket");
return -1;
}
printf("socket success\n");
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
struct sockaddr_in cin;
socklen_t addrlen=sizeof(cin);
char buf[128]="";
while(1){
bzero(buf,sizeof(buf));
//发送数据
printf("请输入:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
if(sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&sin,sizeof(sin)) == -1){
ERR_MSG("sendto");
return -1;
}
printf("send success\n");
}
//关闭文件描述符
close(cfd);
return 0;
}