头文件
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
Server端
1.建立通信socket接口
struct sockaddr_in sin;//套接字
int sock;//文件描述符
if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){
perror("socket");
exit(1);
}//建立通讯接口
memset(&sin,0,sizeof(sin));//重置套接字
sin.family=AF_INET;//ipv4协议
sin.sin_addr.s_addr=htonl("192.168.0.0");//服务端ip地址
sin.port=htons(5001);//服务端端口
2.对socket定位bind绑定
if(bind(sock,(struct sockaddr*)&sin,sizeof(sin))<0){
perror("bind");
exit(1);
}
3.监听(主动套接字变被动套接字)
if(listen(sock,BACKLOG)<0){
perro("listen");
exit(1);
}//BACKLOG 最大连接数,包括未连接【tcp三次握手正在建立连接+已经连接】
4.阻塞,等待连接
int newsock;
newsock=accept(sock,NULL,NULL);//(addr,addrlen)参数为NULL则为所有客户端都提供服务
if(newsock<0){
perror("accept");
exit(1);
}//返回已完成连接,已完成连接队列为空,进程被投入睡眠
5.接收数据
char buff[BUFSIZ];
int ret;
while(1){
memset(&buff,0,sizeof(buff));
do{
ret=read(newsock,buff,BUFSIZE-1);
}
}while(ret<0 && EINTR == errno);//read中断或错误时返回-1,错误代码存入EINTR
if(ret<0){
perror("read");
exit(1);
}
if(ret=0){
break;
}//read遇到文件尾返回0
if(ret!=1){
printf("massage:%s",buff);
//回传客户端
if(write(newsock,buff,strlen(buff)<0){
perror(write);
exit(1);
}
6.关闭套接字
close(newsock);
close(sock);
Client端
1.建立通信socket接口
struct sockaddr_in sin;
int sock;
if((sock = socket(AF_INET,SOCK_DGRAM,0))==-1){
perror("socket");
exit(1);
}
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(SERV_PORT);
if(inet_pton(AF_INET,"192.168.0.0",(void*)& sin.sin_addr.s_addr)!=1){
perror("inet_pton");
exit(1);
}//将IP地址从字符串格式转换成网络地址格式
2.与socket建立连接
if(connect(sock,(struct sockaddr*)&sin,sizeof(sin))<0){
perror("connect");
exit(1);
}
3.发送数据
char recvbuff[BUFSIZ];
char sendbuff[BUFSIZ];
int ret;
while(1){
memset(&recvbuff,0,sizeof(buff));
memset(&sendbuff,0,sizeof(buff));
if(fgets(sendbuff,sizeof(sendbuff)-1,stdin)==NULL)
continue;
do{
ret = write(sock,sendbuff,sizeof(sendbuff)-1);//write遇到了中断,返回-1,同时置errno为EINTR
}while(ret < 0 && EINTR == errno);
if(ret == 0){
perror(write);
break;
}//write返回0,表示出错,无法写入
//接收回传数据
if(read(sock,recvbuff,strlen(recvbuff))<0){
perror(read);
exit(1);
}
printf("send:%s",recvbuff);
}
4.关闭套接字
close(sock);