芙蓉妹妹 - 云代码空间
——
/******** 头文件 *********/
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <strings.h>
#include <stdlib.h>
#include <stdio.h>
/******** 宏定义 ********/
#define BUFFSIZE 100
int main()
{
int listenFd, connectFd;
socklen_t len;
int n;
struct sockaddr_in srcAddr, cliAddr;
char buf[BUFFSIZE];
//create socket
if((listenFd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket error");
exit(1);
}
bzero(&srcAddr, sizeof(srcAddr));
srcAddr.sin_family = AF_INET;
srcAddr.sin_port = htons(8888);
srcAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定套接字
if(bind(listenFd, (struct sockaddr*)&srcAddr, sizeof(srcAddr)) == -1)
{
perror("bind error");
exit(1);
}
//监听套接字
if(listen(listenFd, 5) == -1)
{
perror("listen error");
exit(1);
}
len = sizeof(cliAddr);
printf("listening ...\n");
while(1)
{
//从已完成队列中抓取一个套接字进行服务
if((connectFd = accept(listenFd, (struct sockaddr*)&cliAddr, &len)) == -1)
{
perror("accept error");
exit(1);
}
printf("accepted successful\n");
//从套接字中读取从客户端发来的数据
while((n = read(connectFd, buf, BUFFSIZE)) > 0)
{
if(buf[n] != '\0')
{
buf[n] = '\0';
}
printf("receive a message: %s", buf);
//将读取的数据写进套接字,发给客户端
if(write(connectFd, buf, n) < 0)
{
perror("write error");
exit(1);
}
}
}
//进程退出后,所有打开的文件描述符都会被关闭,因此打开的套接字文件也被关闭
return 0;
}
二、客户端代码/******** 头文件 *********/
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <strings.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
/******** 宏定义 *********/
#define BUFFSIZE 100
int main()
{
int sockFd;
int n;
struct sockaddr_in serverAddr;
char sendBuf[BUFFSIZE], recvBuf[BUFFSIZE];
//创建套接字
if((sockFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket error");
exit(1);
}
bzero(&serverAddr, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888);
inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);
//连接套接字
if(connect(sockFd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0)
{
perror("connect error");
exit(1);
}
//从标准输入中读取一行数据
while(fgets(sendBuf, BUFFSIZE, stdin) != NULL)
{
//将数据写入到套接字,发送给服务器
write(sockFd, sendBuf, strlen(sendBuf));
//从套接字中读取从服务器发来的数据
n = read(sockFd, recvBuf, BUFFSIZE);
//将接受到的数据写到标准输出中
write(STDIN_FILENO, recvBuf, n);
}
return 0;
}
三、实验截图
服务端:
客户端: