标签:mil accept size nec log stdin pen char s printf
#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<poll.h>
#include<errno.h>
#include<string.h>
#define buflen 1024
#define port 8888
#define openmax 1024
#define backlog 10
int main(int argc,char *argv[]){
int listenfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in servaddr;
bzero(&servaddr,sizeof(&servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
int ret = bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
ret = listen(listenfd,backlog);
struct pollfd client[openmax];
int i =0;
for(i = 0;i<openmax;i++){
client[i].fd = -1;
}
client[0].fd = listenfd;
client[0].events = POLLIN;
int maxi = 0;
int len ;
int nready ;
int connfd,sockfd;
struct sockaddr_in clientaddr;
socklen_t client_len = sizeof(clientaddr);
char buf[buflen];
char str[buflen];
while(1){
nready = poll(client ,maxi+1,-1);
if(client[0].revents & POLLIN){
connfd = accept(listenfd,(struct sockaddr*)&clientaddr,&client_len);
printf("received form %s \t at port %d\n",inet_ntop(AF_INET,&clientaddr.sin_addr,str,sizeof(str)),ntohs(clientaddr.sin_port));
for(int i = 1;i<openmax;i++){
if(client[i].fd<0){
client[i].fd = connfd;
break;
}
}
client[i].events = POLLIN;
if(i>maxi){
maxi = i;
}
if(--nready <= 0){
continue;
}
}
for(i = 1;i<maxi;i++){
sockfd = client[i].fd ;
if(sockfd<0){
continue;
}
len = read(sockfd,buf,buflen);
if(len<=0){
printf("CLOSE connection \n");
close(sockfd);
client[i].fd = -1;
}
else{
int k ;
for(k = 0;k<len;k++){
buf[k] = toupper(buf[k]);
}
write(sockfd,buf,buflen);
}
if(--nready <= 0){
break;
}
}
}
return 0;
}
服务端
#include<stdio.h>
#include<sys/socket.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<stdlib.h>
#define port 8888
#define buflen 1024
int main(int argc,char* argv[]){
int sockfd = socket(AF_INET,SOCK_STREAM,0);
int len ;
if(sockfd<0){
printf("socket failed\n");
exit(1);
}
char recvbuf[buflen];
struct sockaddr_in serv_addr;
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr);
int ret = connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
printf("start to connect...\n");
while(fgets(recvbuf,sizeof(recvbuf),stdin)!=NULL){
write(sockfd,recvbuf,strlen(recvbuf));
len = read(sockfd,recvbuf,sizeof(recvbuf));
write(STDOUT_FILENO,recvbuf,len);
}
return 0;
}
客户端
标签:mil accept size nec log stdin pen char s printf
原文地址:https://www.cnblogs.com/yjds/p/9080049.html