服务器程序:
1. 创建一个socket,用函数socket()
2. 绑定IP地址、端口等信息到socket上,用函数bind()
3.设置允许的最大连接数,用函数listen()
4.接收客户端上来的连接,用函数accept()
5.收发数据,用函数send()和recv(),或者read()和write()
6.关闭网络连接
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<pthread.h>
#define PORT 8000
void *ClientHandler(void *arg)
{
pthread_detach(pthread_self()) ; //线程分离
int ret;
int fd=*(int *)arg;
char buf[32]={0};
ret=recv(fd,buf,sizeof(buf),0); //4个参数
if(-1==ret)
{
perror("recv");
// exit(1);
}
printf("recv from %d client %s!\n",fd,buf);
memset(buf,0,sizeof(buf));
}
int main()
{
int sockfd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int fd[1000]={0},i=0;
pthread_t tid;
sockfd=socket(PF_INET,SOCK_STREAM,0); //创建socket ,有 3个参数
if(-1==sockfd) //若创建失败
{
perror("socket");
exit(1);
}
int length=sizeof(server_addr);
server_addr.sin_family=PF_INET; //PF_INET 地址族
server_addr.sin_port= PORT; //端口号
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //ip地址 绑定什么连接什么地址
int ret=bind(sockfd,(struct sockaddr *)&server_addr,length); //绑定 ,强制类型转换
if(-1==ret)
{
perror("bind");
exit(1);
}
ret=listen(sockfd,5); //监听队列的大小
if(-1==ret) //若监听失败
{
perror("listen");
exit(1);
}
while(1)
{
length=sizeof(client_addr);
memset (&client_addr,0,sizeof(client_addr));
fd[i]=accept(sockfd,(struct sockaddr *)&client_addr,&length);
if(-1==ret)
{
perror("accept");
exit(1);
}
printf("accept port %d fd %d\n",client_addr.sin_port,fd[i]);
ret=pthread_create(&tid,NULL,ClientHandler,&fd[i]) ; //创建线程
if(ret!=0)
{
perror("pthread_create");
}
i++;
// pthread_join(); //等待线程结束,回收资源 ,阻塞性函数,聊天室不能用。 卡死
}
return 0;
}
客户端程序:
1.创建一个socket,用函数socket()
2.设置要连接的对方的IP地址和端口等属性
3.连接服务器,用函数connect()
4.收发数据,用函数send()和recv(),或者 read()和write()
5.关闭网络连接
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#define PORT 8000
int main()
{
int sockfd,ret;
char buf[32]={0};
struct sockaddr_in server_addr;
sockfd=socket(PF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("socket");
exit(1);
}
int length=sizeof(server_addr);
server_addr.sin_family=PF_INET; //PF_INET 地址族
server_addr.sin_port= PORT; //端口号
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //ip地址 绑定什么连接什么地址
ret=connect (sockfd,(struct sockaddr *)&server_addr,length);
if(-1==ret)
{
perror("connect");
exit(1);
}
while(1)
{
scanf("%s",buf);
ret=send(sockfd,buf,strlen(buf),0);
if(-1==ret)
{
perror("send");
}
memset(buf,0,sizeof(buf));
}
return 0;
}