/*server.c*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <ctype.h>
#define N 64
#define SERV_PORT 6666 //设置端口号
#define SERV_IP "0" //设置服务器的IP
int main(int argc, char *argv[])
{
int listenfd; //用于保存监听套接字
int connfd; //用于保存通信的套接字
char buf[N] = {0}; //用于保存客户端发来的信息
//1、创建套接字
listenfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == listenfd)
{
perror("socket");
return -1;
}
printf("socket %d ok!\n",listenfd);
//填充ip等信息到通用ip结构体
struct sockaddr_in saddr = {
.sin_family = AF_INET,
.sin_port = htons(SERV_PORT),
.sin_addr.s_addr = inet_addr(SERV_IP)
};
//设置套接字属性、端口重用 setsockopt();
int opt = 1;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
//2、绑定ip和端口
int ret1 = bind(listenfd,(struct sockaddr *)&saddr,sizeof(saddr));
if(-1 == ret1)
{
perror("bind");
return -1;
}
printf("bind ok!\n");
//3、监听
int ret2 = listen(listenfd,8);
if(-1 == ret2)
{
perror("listen");
return -1;
}
printf("waiting for connection...");
//循环监听客户端
while(1)
{
//4、处理客户端请求
struct sockaddr_in caddr = {0};
socklen_t clen = sizeof(caddr);
connfd = accept(listenfd,(struct sockaddr *)&caddr,&clen);
if(-1 == connfd)
{
perror("accept");
return -1;
}
printf("client(%s: %d)\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
//5、通信
while(1)
{
memset(buf,0,sizeof(buf));
int ret3 = recv(connfd,buf,sizeof(buf),0);
if(-1 == ret3)
{
perror("read");
return -1;
}
else if(0 == ret3)
{
printf("client quit\n");
break;
}
printf("recv: %s",buf);
}
//6、关闭套接字
close(connfd);
}
close(listenfd);
return 0;
}
/*client.c*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#define N 64
#define SERV_PORT 6666 //设置端口号
#define SERV_IP "0" //设置服务器的IP
int main(int argc, char *argv[])
{
int sockfd;
char buf[N] = {0};
//1、创建套接字
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("socket");
return -1;
}
printf("socket %d ok!\n",sockfd);
//填充ip等信息到通用ip结构体
struct sockaddr_in saddr = {
.sin_family = AF_INET,
.sin_port = htons(SERV_PORT),
.sin_addr.s_addr = inet_addr(SERV_IP)
};
//2、连接服务器
int ret = connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
if(-1 == ret)
{
perror("connect");
return -1;
}
printf("connect ok!\n");
//3、通信
while(1)
{
printf("send: ");
fgets(buf,sizeof(buf)-1,stdin);
send(sockfd,buf,strlen(buf),0);
}
//4、关闭通信
close(sockfd);
return 0;
}