下面介绍socket实现通信的例子,客户端socket client和服务端socket server
socket server代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/socket.h>
#include<linux/in.h>
#include<arpa/inet.h>
#include<signal.h>
#define PORT 8888
#define BACKLOG 5
void process_conn_server(int s){
char buffer[1024];
ssize_t size=0;
char strs[7]="server:";
for(;;){
size=recv(s,buffer,1024,0);
if(size>0){
sprintf(buffer,"%d bytes together",size);
write(1,buffer,size); //write to standard output
send(s,strs,strlen(strs)+1,0);
send(s,buffer,strlen(buffer)+1,0);
}
}
}
int main(int argc,char *argv[]){
printf("hello,wlcome to server!");
int ss,sc;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int err;
pid_t pid;
// bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
// server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(&(server_addr.sin_zero),8);
ss=socket(AF_INET,SOCK_STREAM,0);
if(ss<0){
printf("socket error !");
return -1;
}
err=bind(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));
if(err<0){
printf("bind error !");
return -1;
}
err=listen(ss,BACKLOG);
if(err<0){
printf("listen error !");
return -1;
}
printf("start accept:");
while(1){
printf("wait for connection:");
int addr_len=sizeof(struct sockaddr);
sc=accept(ss,(struct sockaddr*)&client_addr,&addr_len);
if(sc<0){
continue;
}
printf("start a connection successfully !");
pid=fork();
if(pid==0){
// close(ss);
printf("child pid:");
process_conn_server(sc);
}else if(pid>0){
// close(sc);
printf("parent pid !");
// process_conn_server(sc);
}else{
printf("fork pid failed !");
break;
}
// process_conn_server(sc);
}
// process_conn_server(sc);
return 0;
}
socket client代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
//#include<linux/in.h>
#include<netinet/in.h>
#include<signal.h>
#define PORT 8888
static int s;
void sig_process_client(int signo){
printf("\nCatch a exit signal !\n");
close(s);
exit(0);
}
void process_conn_client(int ss){
ssize_t size=0;
ssize_t count=0;
char buffer[1024];
char temp[1024];
char src[5]="From:";
for(;;){
/*read data from standard input and stored in buffer*/
size=read(0,buffer,1024);
// count=recv(ss,temp,1024,0);
/* if(count>0){
send(ss,src,strlen(src)+1,0);
} */
if(size>0){
// sprintf(buffer,"%d bytes together !",size);
// write(ss,buffer,size);
send(ss,buffer,size,0);
count=recv(ss,temp,1024,0);
write(1,temp,count); /*write to standard output*/
printf("\n");
}
}
}
int main(int argc,char *argv[]){
struct sockaddr_in server_addr;
// if(argc==1){
// printf("Please input server address:\n");
// return 0;
// }
signal(SIGINT,sig_process_client);
s=socket(AF_INET,SOCK_STREAM,0);
if(s<0){
printf("socket error !");
}
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
// server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
// inet_pton(AF_INET,argv[1],&server_addr.sin_addr);
bzero(&(server_addr.sin_zero),8);
connect(s,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
process_conn_client(s);
return 0;
}