//server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>
#define PORT 1234
#define MAXSOCKFD 10
int main(int argc,char **argv)
{
int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
fd_set readfds;
char buffer[256];
char msg[] = "Welcome to server";
if(sockfd = socket(AF_INET,SOCK_STREAM,0) < 0){
perror("socket");
exit(1);
}
//fill in struct sockaddr_in
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&addr,(socklen_t)sizeof(addr)) < 0){
perror("bind");
exit(1);
}
if(listen(sockfd,3) < 0){
perror("listen");
exit(1);
}
//clean up connect status flags
for(fd = 0;fd < MAXSOCKFD;fd++)
is_connected[fd] = 0;
while(1){
FD_ZERO(&readfds);
FD_SET(sockfd,&readfds);
for(fd = 0;fd < MAXSOCKFD;fd++){
if(is_connected[fd])
FD_SET(fd,&readfds);
}
if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))
continue;
//estimate whether have new connect or new message
for(fd = 0;fd < MAXSOCKFD;fd++){
if(FD_ISSET(fd,&readfds)){
if(sockfd == fd){
//new connect
if((newsockfd = accept(sockfd,(struct sockaddr *)&addr,&addr_len)) < 0)
perror("accept");
//send msg to clent
write(newsockfd,msg,sizeof(msg));
is_connected[newsockfd] = 1;
printf("connect from %s\n",inet_ntoa(addr.sin_addr));
}else{
//new message
bzero(buffer,sizeof(buffer));
if(read(fd,buffer,sizeof(buffer)) <= 0){
//the connect break off,clean up connet status
printf("connection closed.\n");
is_connected[fd] = 0;
close(fd);
}else
printf("%s",buffer);
}
}
}
}
}
//client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#define PORT 1234
#define SERVER_IP "192.168.7.109"
int main(int argc,char **argv)
{
int sockfd;
struct sockaddr_in addr;
char buffer[256];
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
perror("socket");
exit(1);
}
//fill in struct sockaddr_in
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
//attempt to connect
if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)) < 0){
perror("connect");
exit(1);
}
//accept messages from server
recv(sockfd,buffer,sizeof(buffer),0);
printf("%s\n",buffer);
while(1){
bzero(buffer,sizeof(buffer));
//read string from stdin
read(0,buffer,sizeof(buffer));
//send string to server
if(send(sockfd,buffer,sizeof(buffer),0) < 0){
perror("send");
exit(1);
}
}
}
TCP程序简单示例
最新推荐文章于 2024-11-09 17:46:22 发布