多线程多任务发送
#include <head.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/wait.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#define PORT 8888
#define IP "192.168.125.104"
int sfd;
struct Cs
{
int newsfd;
struct sockaddr_in cin;
};
void handler(int sig);
void handler(int sig)
{
while(waitpid(-1,NULL,WNOHANG) > 0);
}
void *ATid(void* cs1);
void *ATid(void* cs1)
{
struct sockaddr_in cin = ((struct Cs *)cs1)->cin;
int newsfd = ((struct Cs *)cs1)->newsfd;
char buf[128] = "";
ssize_t res = 0;
ssize_t res1 = 0;
while(1)
{
//接收客户端的消息
bzero(buf,sizeof(buf));
res = recv(newsfd,buf,sizeof(buf),0);
if(res < 0)
{
perror("recv--> ");
return NULL;
}
else if(res == 0)
{
printf("来自[%s : %d] newsfd-->%d 客户端已下线\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newsfd);
break;
}
printf("收到来自[%s : %d] newsfd-->%d 的消息: %s \n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newsfd,buf);
//发送消息给客户端
strcat(buf,"*_*\n");
res1 = send(newsfd,buf,sizeof(buf),MSG_DONTWAIT);
if(res1 < 0)
{
perror("send--> ");
return NULL;
}
}
close(newsfd);
pthread_exit(NULL);
}
int main()
{
if(signal(17,handler) == SIG_ERR)
{
perror("signal-->");
return -1;
}
printf("signal success\n");
//创建套接字
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd < 0)
{
perror("socket--> ");
return -1;
}
printf("socket success,sfd--> %d\n",sfd);
int reuse = 1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
{
perror("setsockopt-->\n");
return -1;
}
printf("setsockopt success\n");
//填充地址消息结构体,真实地址消息结构体根据地址族制定
//AF_INET: man 7 ip
struct sockaddr_in sin;//定义结构体(给结构体内的每个元素赋值)
sin.sin_family = AF_INET;//网络协议-IPV4
sin.sin_port = htons(PORT);//端口号6666-49151
sin.sin_addr.s_addr = inet_addr(IP);//本机ip地址
//绑定服务器的ip及端口
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0 )
{
perror("bing---> ");
return -1;
}
printf("bind success\n");
//将套接字设置为被动监听状态
if(listen(sfd,128) < 0)
{
perror("listlen--> ");
return -1;
}
printf("listen success\n");
//从已经完成链接的队列中获取一个客户端消息,生成一个新的文件描述符
//该文件描述符才是与客户端进行通信的文件描述符
struct Cs cs2;
//struct sockaddr_in cin;//存储客户端地址消息
//socklen_t addrlen = sizeof(cin);
socklen_t addrlen = sizeof(cs2.cin);
//pid_t cpid = 0;
//int newsfd = -1;
while(1)
{
// struct sockaddr_in cin;
cs2.newsfd = accept(sfd,(struct sockaddr*)&cs2.cin,&addrlen);
if(cs2.newsfd < 0)
{
perror("accpet-->");
return -1;
}
printf("来自[%s : %d] newsfd-->%d 客户端已链接\n",\
inet_ntoa(cs2.cin.sin_addr),ntohs(cs2.cin.sin_port),cs2.newsfd);
pthread_t tida;
if(pthread_create(&tida,NULL,ATid,(void*)&cs2) < 0)
{
perror("Atid-->");
return -1;
}
}
//关闭套接字
close(sfd);
return 0;
}
-------------------------------------------------------------
ubuntu@ubuntu:TCP多线程$ ./tcpser
signal success
socket success,sfd--> 3
setsockopt success
bind success
listen success
来自[192.168.125.97 : 56457] newsfd-->4 客户端已链接
来自[192.168.125.97 : 56459] newsfd-->5 客户端已链接
来自[192.168.125.97 : 56460] newsfd-->6 客户端已链接
收到来自[192.168.125.97 : 56457] newsfd-->4 的消息: Apple
收到来自[192.168.125.97 : 56457] newsfd-->4 的消息: Apple
收到来自[192.168.125.97 : 56457] newsfd-->4 的消息: Apple
收到来自[192.168.125.97 : 56459] newsfd-->5 的消息: hellp
收到来自[192.168.125.97 : 56459] newsfd-->5 的消息: hellp
收到来自[192.168.125.97 : 56459] newsfd-->5 的消息: hellp
收到来自[192.168.125.97 : 56460] newsfd-->6 的消息: goodd
收到来自[192.168.125.97 : 56460] newsfd-->6 的消息: goodd
收到来自[192.168.125.97 : 56460] newsfd-->6 的消息: goodd
来自[192.168.125.97 : 56457] newsfd-->4 客户端已下线
来自[192.168.125.97 : 56459] newsfd-->5 客户端已下线
来自[192.168.125.97 : 56460] newsfd-->6 客户端已下线
来自[192.168.125.97 : 56466] newsfd-->7 客户端已链接
收到来自[192.168.125.97 : 56466] newsfd-->7 的消息: Apple
收到来自[192.168.125.97 : 56466] newsfd-->7 的消息: Apple
来自[192.168.125.97 : 56468] newsfd-->4 客户端已链接
来自[192.168.125.97 : 56526] newsfd-->5 客户端已链接
收到来自[192.168.125.97 : 56526] newsfd-->5 的消息: goodd
收到来自[192.168.125.97 : 56526] newsfd-->5 的消息: goodd
收到来自[192.168.125.97 : 56526] newsfd-->5 的消息: goodd
多进程多任务发送
#include <head.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/wait.h>
#define PORT 8888
#define IP "192.168.125.104"
void handler(int sig);
void handler(int sig)
{
while(waitpid(-1,NULL,WNOHANG) > 0);
}
void deal_chert(int newsfd,struct sockaddr_in cin,struct sockaddr_in sin);
void deal_chert(int newsfd,struct sockaddr_in cin,struct sockaddr_in sin)
{
char buf[128] = "";
ssize_t res = 0;
ssize_t res1 = 0;
while(1)
{
//接收客户端的消息
bzero(buf,sizeof(buf));
res = recv(newsfd,buf,sizeof(buf),0);
if(res < 0)
{
perror("recv--> ");
return ;
}
else if(res == 0)
{
printf("来自[%s : %d] newsfd-->%d 客户端已下线\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newsfd);
break;
}
printf("收到来自[%s : %d] newsfd-->%d 的消息: %s \n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newsfd,buf);
//发送消息给客户端
strcat(buf,"*_*\n");
res1 = send(newsfd,buf,sizeof(buf),MSG_DONTWAIT);
if(res < 0)
{
perror("send--> ");
return ;
}
/* printf("[%s : %d ] newsfd-->%d buf-->%s",\
inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newsfd,buf);
*/
}
close(newsfd);
}
int main()
{
if(signal(17,handler) == SIG_ERR)
{
perror("signal-->");
return -1;
}
printf("signal success\n");
//创建套接字
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd < 0)
{
perror("socket--> ");
return -1;
}
printf("socket success,sfd--> %d\n",sfd);
int reuse = 1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
{
perror("setsockopt-->\n");
return -1;
}
printf("setsockopt success\n");
//填充地址消息结构体,真实地址消息结构体根据地址族制定
//AF_INET: man 7 ip
struct sockaddr_in sin;//定义结构体(给结构体内的每个元素赋值)
sin.sin_family = AF_INET;//网络协议-IPV4
sin.sin_port = htons(PORT);//端口号6666-49151
sin.sin_addr.s_addr = inet_addr(IP);//本机ip地址
//绑定服务器的ip及端口
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0 )
{
perror("bing---> ");
return -1;
}
printf("bind success\n");
//将套接字设置为被动监听状态
if(listen(sfd,128) < 0)
{
perror("listlen--> ");
return -1;
}
printf("listen success\n");
//从已经完成链接的队列中获取一个客户端消息,生成一个新的文件描述符
//该文件描述符才是与客户端进行通信的文件描述符
struct sockaddr_in cin;//存储客户端地址消息
socklen_t addrlen = sizeof(cin);
pid_t cpid = 0;
int newsfd = -1;
while(1)
{
newsfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
if(newsfd < 0)
{
perror("accpet-->");
return -1;
}
printf("来自[%s : %d] newsfd-->%d 客户端已链接\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newsfd);
cpid = fork();
if(cpid > 0)
{
close(newsfd);
}
//获取链接成功后的套接字
else if(cpid == 0)
{
close(sfd);
deal_chert(newsfd,cin,sin);
exit(0);
}
}
//关闭套接字
close(sfd);
close(newsfd);
return 0;
}
--------------------------------------------------------------------
ubuntu@ubuntu:TCP多进程$ ./tcpser
signal success
socket success,sfd--> 3
setsockopt success
bind success
listen success
来自[192.168.125.97 : 56688] newsfd-->4 客户端已链接
来自[192.168.125.97 : 56689] newsfd-->4 客户端已链接
来自[192.168.125.97 : 56690] newsfd-->4 客户端已链接
收到来自[192.168.125.97 : 56688] newsfd-->4 的消息: Apple
收到来自[192.168.125.97 : 56688] newsfd-->4 的消息: Apple
收到来自[192.168.125.97 : 56688] newsfd-->4 的消息: Apple
收到来自[192.168.125.97 : 56689] newsfd-->4 的消息: hellp
收到来自[192.168.125.97 : 56689] newsfd-->4 的消息: hellp
收到来自[192.168.125.97 : 56689] newsfd-->4 的消息: hellp
收到来自[192.168.125.97 : 56690] newsfd-->4 的消息: goodd
收到来自[192.168.125.97 : 56690] newsfd-->4 的消息: goodd
收到来自[192.168.125.97 : 56690] newsfd-->4 的消息: goodd
来自[192.168.125.97 : 56688] newsfd-->4 客户端已下线
来自[192.168.125.97 : 56689] newsfd-->4 客户端已下线
来自[192.168.125.97 : 56690] newsfd-->4 客户端已下线
来自[192.168.125.97 : 56701] newsfd-->4 客户端已链接
来自[192.168.125.97 : 56702] newsfd-->4 客户端已链接
来自[192.168.125.97 : 56703] newsfd-->4 客户端已链接
来自[192.168.125.97 : 56701] newsfd-->4 客户端已下线
来自[192.168.125.97 : 56702] newsfd-->4 客户端已下线
来自[192.168.125.97 : 56703] newsfd-->4 客户端已下线
广播
#include <head.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 6666
#define IP "192.168.125.255"
int main()
{
printf("<===========接收方============>\n");
//创建报文套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd < 0)
{
perror("socket--> ");
return -1;
}
printf("socket success,sfd--> %d\n",sfd);
//填充地址消息结构体,真实地址消息结构体根据地址族制定
//AF_INET: man 7 ip
struct sockaddr_in sin;//定义结构体(给结构体内的每个元素赋值)
sin.sin_family = AF_INET;//网络协议-IPV4
sin.sin_port = htons(PORT);//端口号1024-69151
sin.sin_addr.s_addr = inet_addr(IP);//uabntu的本机ip地址
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0 )
{
perror("bing---> ");
return -1;
}
printf("bind success\n");
//数据 <===> 交互
struct sockaddr_in cin;//定义结构体(给结构体内的每个元素赋值)
socklen_t addrlen = sizeof(cin);
char buf[128] = "";
ssize_t res = 0;
ssize_t res1 = 0;
while(1)
{
//接收(发送者)客户端的消息
bzero(buf,sizeof(buf));
res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);
if(res < 0)
{
perror("recvfrom--> ");
return -1;
}
printf("[%s : %d] buf-->%s ",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
}
//关闭套接字
close(sfd);
return 0;
}
------------------------------------------------------------------------------
#include <head.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 6666
#define IP "192.168.125.255"
int main()
{
printf("<===========发送方===========>\n");
//创建报文套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd < 0)
{
perror("socket--> ");
return -1;
}
printf("socket success,sfd--> %d\n",sfd);
int k = 1;
int len = sizeof(k);
if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&k,len) < 0)
{
perror("getsockopt-->");
return -1;
}
printf("广播success k=%d\n",k);
//填充地址消息结构体,真实地址消息结构体根据地址族制定
struct sockaddr_in sin;//定义结构体(给结构体内的每个元素赋值)
sin.sin_family = AF_INET;//网络协议-IPV4
sin.sin_port = htons(PORT);//端口号1024-69151
sin.sin_addr.s_addr = inet_addr(IP);//uabntu的本机ip地址
//数据 <===> 交互
char buf[128] = "";
ssize_t res = 0;
ssize_t res1 = 0;
while(1)
{
//发送消息给服务器
bzero(buf,sizeof(buf));
printf("请输入--> ");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = 0;
res1 = sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin));
if(res1 < 0)
{
perror("sendto--> ");
return -1;
}
printf("sendto success\n");
}
//关闭套接字
close(sfd);
return 0;
}
组播
#include <head.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 6666
#define GRP_IP "224.1.2.3"
#define IP "192.168.125.104"
int main()
{
printf("<===========接收方============>\n");
//创建报文套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd < 0)
{
perror("socket--> ");
return -1;
}
printf("socket success,sfd--> %d\n",sfd);
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)) < 0)
{
perror("setsockopt-->");
return -1;
}
printf("加入多播组 [%s : %d] success",GRP_IP,PORT);
//填充地址消息结构体,真实地址消息结体根据地址族制定
//AF_INET: man 7 ip
struct sockaddr_in sin;//定义结构体(给结构体内的每个元素赋值)
sin.sin_family = AF_INET;//网络协议-IPV4
sin.sin_port = htons(PORT);//端口号1024-69151
sin.sin_addr.s_addr = inet_addr(IP);//uabntu的本机ip地址
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0 )
{
perror("bing---> ");
return -1;
}
printf("bind success\n");
//数据 <===> 交互
struct sockaddr_in cin;//定义结构体(给结构体内的每个元素赋值)
socklen_t addrlen = sizeof(cin);
char buf[128] = "";
ssize_t res = 0;
ssize_t res1 = 0;
while(1)
{
//接收(发送者)客户端的消息
bzero(buf,sizeof(buf));
res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);
if(res < 0)
{
perror("recvfrom--> ");
return -1;
}
printf("[%s : %d] buf-->%s ",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
}
//关闭套接字
close(sfd);
return 0;
}
------------------------------------------------------------------------------
#include <head.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 6666
#define IP "224.1.2.3"
int main()
{
printf("<===========发送方===========>\n");
//创建报文套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd < 0)
{
perror("socket--> ");
return -1;
}
printf("socket success,sfd--> %d\n",sfd);
//填充地址消息结构体,真实地址消息结构体根据地址族制定
struct sockaddr_in sin;//定义结构体(给结构体内的每个元素赋值)
sin.sin_family = AF_INET;//网络协议-IPV4
sin.sin_port = htons(PORT);//端口号1024-69151
sin.sin_addr.s_addr = inet_addr(IP);//uabntu的本机ip地址
//数据 <===> 交互
char buf[128] = "";
ssize_t res = 0;
ssize_t res1 = 0;
while(1)
{
//发送消息给服务器
bzero(buf,sizeof(buf));
printf("请输入--> ");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = 0;
res1 = sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin));
if(res1 < 0)
{
perror("sendto--> ");
return -1;
}
printf("sendto success\n");
}
//关闭套接字
close(sfd);
return 0;
}