本章简单介绍linux上的socket通信
实现目的:创建客户端和服务器端 ,实现客户端定时向客户端发送消息。
服务器端代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
void perr(char *p){
perror(p);
exit(-1);
}
typedef enum __bool{true=1,false=0,} bool;//自定义bool变量;
int main()
{
bool isReUsed=true;
struct sockaddr_in sa;
sa.sin_family=AF_INET;//通信协议族
sa.sin_port=htons(10110);//通信端口
sa.sin_addr.s_addr=htonl(INADDR_ANY);//表示可以接收所有地址的链接
int sockid=socket(AF_INET,SOCK_STREAM,0);//创建socket套接字
if(sockid == -1 ){perror("socket");return -1;}
//一般程序退出时,socket资源不会立即释放,所以设置资源的重复利用。
setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,(const char *)isReUsed,sizeof(bool));
//绑定地址。
if(bind(sockid,(struct sockaddr*)&sa,sizeof(sa)) == -1) perr("bind");
//监听套接字
if(listen(sockid,4) == -1) perr("listen");
while(1){
socklen_t slen=sizeof(struct sockaddr_in);
//接受客户端信息,accep函数是阻塞函数,当没有客户端连接时
//它会阻塞,游客户端连接时,它返回用于通信用的描述符。
int confd=accept(sockid,(struct sockaddr*)&sa,&slen);
if(confd == -1)perr("accept");
pid_t pid=fork();//创建子进程处理客户端消息。
if(pid == -1) perr("fork");
if(pid == 0)
{
while(1)
{
char buf[1024];
recv(confd,buf,1024,0);
printf("accept : %s\n",buf);
}
}
}
}
客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
void perr(char *o)
{
perror(o);
exit(-1);
}
typedef enum __bool{true=1,false=0} bool;
int main ()
{
bool IsReUsed=true;
struct sockaddr_in sa;
sa.sin_family=AF_INET;//协议族
sa.sin_port=htons(10110);//通信端口
sa.sin_addr.s_addr=inet_addr("127.0.0.1");//要连接的IP地址
int sockid=socket(AF_INET,SOCK_STREAM,0);//创建套接字
if(sockid ==-1)perr("socket");
setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,(const char *)IsReUsed,sizeof(bool));
//连接服务器端
if(connect(sockid,(struct sockaddr*)&sa,sizeof(sa))== -1)perr("connect");
while(1)
{
char buf[1024]="hello , I'm the client";
send(sockid,buf,sizeof(buf),0);
sleep(1);
//每过一秒发送一个消息。
}
}
运行结果: