1.客户端程序
#include<stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char ch[255] = "hello,I am client. \n";
char buffer[255];
//创建客户套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
//命名
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");//服务端地址
address.sin_port = htons(9734);//服务端端口
len = sizeof(address);
//将客户套接字连接到服务器套接字
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1)
{
perror("client error! \n");
exit(1);
}
//通过套接字进行请读写操作
write(sockfd, ch, 255);
read(sockfd, buffer, 255);
printf("char from server: %s \n", buffer);
close(sockfd);
return 0;
}
2.服务端程序
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
int main()
{
//声明有用的变量
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address,client_address;
int result;
struct timeval timeout;
int MAX_FD = 0;
fd_set readfds,testfds;
timeout.tv_sec = 2;
timeout.tv_usec = 500000;
//为服务器创建一个套接字并命名
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
//sockaddr可以看做是sockaddr_in或sockaddr_un
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
//创建队列
listen(server_sockfd, 5);
FD_ZERO(&readfds);
FD_SET(server_sockfd, &readfds);
printf("server_sockfd: %d \n", server_sockfd);
MAX_FD = server_sockfd;
//等待、处理客户请求
while(1)
{
char ch[255];
char buffer[255] = "I'm server,your message gotten. \n";
int fd;
int nread;
testfds = readfds;
printf("server waiting. \n");
result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0);
//result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)&timeout);
//printf("test .1");
if(result < 1)
{
perror("server error occured! \n");
exit(1);
}
for(fd = 0; fd < FD_SETSIZE; fd++)
{
if(FD_ISSET(fd, &testfds))
{
//如果活动发生在服务器套接字上,则添加请求连接的客户套接字描述符到描述符集合中
if(fd == server_sockfd)
{
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
FD_SET(client_sockfd, &readfds);
printf("adding client on fd %d \n", client_sockfd);
}
//如果活动发生在客户套接字上(客户套接字是之前while循环中if(FD_ISSET(fd, &testfds)选择分支中添加的),则进行相应处理
else
{
ioctl(fd, FIONREAD, &nread);
//套接字缓冲区没有数据则关闭套接字,并将它从集合中移除
if(nread == 0)
{
close(fd);
FD_CLR(fd, &readfds);
printf("client on fd %d closed. \n", fd);
}
//有数据则,则进行读操作
else
{
read(fd, ch ,255);
sleep(5); //毫秒
printf("message from client: %s \n", ch);
printf("processing clinet on fd %d. \n",fd);
write(fd, buffer, 255);
}
}
}
}
}
return 0;
}