網路通訊,實現客戶端和伺服器端的通訊
阿新 • • 發佈:2019-01-26
write(new_fd,buf,strlen(buf));
}
}else{
perror("fork");
}
}
int main(int argc,char *argv[]){
if(argc!=3){
printf("Usage ./server[ip][port]\n");
return 1;
}
signal(SIGCHLD,SIG_IGN);
int fd=socket(AF_INET,SOCK_STEAM,0);
if(fd<0){
perror("socket");
return 1;
}
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(argv[1]);
addr.sin_port=htons(atoi(argv[2]));
int ret=bind(fd,(sockaddr *)&addr,sizeof(addr));
if(ret<0){
perror("bind");
return 1;
}
ret=listen("fd,5);
if(ret<0){
perror("listen");
return 1;
}
}
while(1){
sockaddr_in peer;
socklen_t len=sizeof(peer);
//
int new_fd=accept(fd,(sockaddr *)&peer,&len);
if(new_fd<0){
perror("accept");
continue;
}
//accept完成之後,建立子程序。讓父程序能夠快速的再次呼叫到accept,等待第二個客戶端的連線,讓子程序來處理當前這個連線的讀寫。
ProcessConnect(new_fd);
}
return 0;
}
2.多執行緒伺服器端
# include<stdio.h>
# include<stdlib.h>
# include<sys/socket.h>
# include<unistd.h>
# include <netinet/in.h>
# include <arpa/inet.h>
typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;
void *ThreadEntry(void *ptr)
{
Arg *arg=(Arg *)ptr;
while(1){
char buf[1024]={0};
ssize_t read_size=read(arg->new_fd,buf,sizeof(buf)-1);
if(read_size<0){
perror("read");
continue;
}
if(read_size==0){
printf("client %s:%d diconnected",inet_ntoa(arg->peer.sin_addr),ntohs(arg->peer.sin_port));
close(arg->new_fd);
free(arg);
return NULL;
}
buf[read_size]='\0';
printf("client %s:%d say:%s\n",inet_nyoa(arg->peer.sin_addr),ntohs(arg->peer.sin_port),buf));
write(arg->new_fd,buf,strlen(buf));
}
return nULL;
}
}
}else{
perror("fork");
}
}
int main(int argc,char *argv[]){
if(argc!=3){
printf("Usage ./server[ip][port]\n");
return 1;
}
signal(SIGCHLD,SIG_IGN);
int fd=socket(AF_INET,SOCK_STEAM,0);
if(fd<0){
perror("socket");
return 1;
}
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(argv[1]);
addr.sin_port=htons(atoi(argv[2]));
int ret=bind(fd,(sockaddr *)&addr,sizeof(addr));
if(ret<0){
perror("bind");
return 1;
}
ret=listen("fd,5);
if(ret<0){
perror("listen");
return 1;
}
}
while(1){
sockaddr_in peer;
socklen_t len=sizeof(peer);
//
int new_fd=accept(fd,(sockaddr *)&peer,&len);
if(new_fd<0){
perror("accept");
continue;
}
//accept完成之後,建立子程序。讓父程序能夠快速的再次呼叫到accept,等待第二個客戶端的連線,讓子程序來處理當前這個連線的讀寫。
ProcessConnect(new_fd);
}
return 0;
}
2.多執行緒伺服器端
# include<stdio.h>
# include<stdlib.h>
# include<sys/socket.h>
# include<unistd.h>
# include <netinet/in.h>
# include <arpa/inet.h>
typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;
void *ThreadEntry(void *ptr)
{
Arg *arg=(Arg *)ptr;
while(1){
char buf[1024]={0};
ssize_t read_size=read(arg->new_fd,buf,sizeof(buf)-1);
if(read_size<0){
perror("read");
continue;
}
if(read_size==0){
printf("client %s:%d diconnected",inet_ntoa(arg->peer.sin_addr),ntohs(arg->peer.sin_port));
close(arg->new_fd);
free(arg);
return NULL;
}
buf[read_size]='\0';
printf("client %s:%d say:%s\n",inet_nyoa(arg->peer.sin_addr),ntohs(arg->peer.sin_port),buf));
write(arg->new_fd,buf,strlen(buf));
}
return nULL;
}